アーキテクチャ設計をカプセル化する インターフェース機構 Archface Archface: An Interface Mechanism for Encapsulating Architechtures 九州工業大学大学院 情報工学府 野村 潤 鵜林 尚靖 2 概要 アーキテクチャ設計は重要 Archface public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observer o){ … } public void removeObserver(Observer o){ … } public void notify(){ Iterator i = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update( this ); } } public void setState(String s){ state = s; } public String getState() {return state; } } 品質は設計の良否に大きく依存 アーキテクチャ設計の課題 設計者の意図を正確に記述すること 実装との一貫性を保つこと 設計と実装の同期を取ること Archface(Architecture + Interface) アーキテクチャをインターフェースとし てカプセル化する 上記の課題を解決 3 目次 1. アーキテクチャ設計の課題 2. Archface 3. Archface for Java 4. 議論と関連研究 5. まとめと今後の課題 1.アーキテクチャ設計の課題 4 5 アーキテクチャ設計を正確に実装に繋げることは難しい アーキテクチャデザイン (Observerパターン) setState()が呼ばれた後には notify()が呼ばれる public class Subject { private String state = ""; public String getState() { return state; } public void setState(String s) { state = s; } … notify()の処理を行っていな プログラムコード } い 6 アーキテクチャ設計の詳細化による解法 一つの解決策としてはアーキテクチャの詳細化がある public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observer o){ … } public void removeObserver(Observer o){ … } public void notify(){ Iterator i = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update( this ); } } public void setState(String s){ state = s; } public String getState() {return state; } } 完全なコードを生成 しかし、アーキテクチャ設計は抽象的でなければならない 7 設計と実装の間の解決すべき3つの課題 アーキテクチャ設計の適切な抽象度 抽象度が高すぎると実装との乖離が大きくなる 抽象度が低すぎると実装との差異が無くなる 設計から実装への洗練 設計の意図を正確にプログラム実装に反映させる 設計と実装の同期 設計に変更があった場合、プログラムコードを修正 プログラムコードに変更があった場合、設計を修正 2.Archface ( = Architecture + Interface) 8 9 Archface:プログラム点を用いたインターフェース アーキテクチャデザイン アーキテクチャの設計 変更の反映 Archface アーキテクチャの 正しい実装 プログラム点の公開と連結 アーキテクチャの変更 public class Subject{ private Vector observers = new Vector(); private String state = “”; … } プログラムコード プログラム点によるアーキテクチャ記述 設計と実装の同期 インターフェースとしてカプセル化 メソッドの呼び出し順序を記述 プログラムの変更を設計に反映 設計と実装の一貫性を保証する 設計の意図をより正確に記述 ※プログラム点=プログラム上の実行点 10 Archfaceの2つのインターフェース コンポーネントインターフェース メソッド呼び出し点や実行点、 コントロールフロー指定の公開 コンポーネントの仕様を公開する コネクタインターフェース コンポーネントの繋がりを定義する コンポーネント × × × 公開したプログラム点をどのように 実行し協調させるかを定義 コンポーネント コネクタ プログラム点の コーディネーション × × × Three-part Modeling Framework [Masuhara, et al. 2003] プログラム点の公開 ×:プログラム点=プログラム上の実行点 11 Archfaceの2つのインターフェース コンポーネントインターフェース コンポーネントの仕様を公開する メソッド呼び出し点や実行点、 コントロールフロー指定の公開 コネクタインターフェース コンポーネントの繋がりを定義する Observerパターン Observer Subject setState cflow getState updateState notifyObservers update cflow 公開したプログラム点をどのように 実行し協調させるかを定義 コンポーネントインターフェース Subject :setState, getState, notifyObservers Observer :update, updateState コネクタインターフェース notifyObservers – update, getState – updateState 3.Archface for Java 12 13 Archfaceの記述 =プログラム点, ポート, コネクタの定義(AspectJを利用) Subject Observerパターン Observer setState cflow getState notify updateState cflow update interface component インターフェース名 { 公開するプログラム点を定義 入出力ポートを定義 } interface connector インターフェース名 { ポート間の接続を定義 } 14 Archfaceの実装 =implements, プログラム点の公開, フローの遵守 プログラムコード Archface コンポーネント インターフェースの implements Archfaceに沿った プログラム点とフローの コーディング Archfaceに沿わない実装 ⇒コンパイル時に通知 15 処理系の構成 Archface definitions Archface parser AspectJ code generator Java code (class) Archface compiler Aspect-Factory class generator AspectJ code (aspect) AspectJ weaver executable program 4.議論と関連研究 16 17 Archfaceによる課題の解決 1) アーキテクチャ設計の抽象度 インターフェースとしてアーキテクチャをカプセル化 2) 設計から実装への洗練 インターフェースに沿ったコーディング 3) 設計と実装の同期 インターフェースを通じた設計と実装の同期 18 関連研究 ArchJava [Aldrich, J. 2002] アーキテクチャとプログラム実装を統合 実装がアーキテクチャ制約と適合することを保証 Design pattern implementation in Java and AspectJ [Hannemann, J. 2002] アーキテクチャを抽象クラス間の協調動作として記述 AspectJを用いてデザインパターンをアスペクトとして分離 5.まとめと今後の課題 19 20 まとめと今後の課題 まとめ プログラム点によるアーキテクチャ記述を インターフェースとしてカプセル化 今後の課題 他のアーキテクチャ記述の導入 現状:オープンクラス、コントロールフロー 今後:データフロー、イベントトレースなど アーキテクチャの曖昧性の排除 DbC( Design by Contract)の導入など ご清聴ありがとうございました 21
© Copyright 2024 ExpyDoc