200 likes | 270 Views
アーキテクチャ設計と実装をつなぐ インターフェース機構 Archface. Archface : An Interface Mechanism for Bridging a Gap between Architectural Design and Implementation. 九州工業大学大学院 情報工学府 野村 潤 鵜林 尚靖. 概要. ソフトウェア開発において アーキテクチャ設計は重要な役割を担う 頑強性 信頼性 保守性. Architecture. しかし 、難しい課題もある 設計者の意図との整合性を保つ アーキテクチャデザインを正しく実装に つなげる
E N D
アーキテクチャ設計と実装をつなぐインターフェース機構Archfaceアーキテクチャ設計と実装をつなぐインターフェース機構Archface Archface: An Interface Mechanism for Bridging a Gap between Architectural Design and Implementation 九州工業大学大学院 情報工学府 野村潤鵜林尚靖
概要 • ソフトウェア開発においてアーキテクチャ設計は重要な役割を担う • 頑強性 • 信頼性 • 保守性 Architecture • しかし、難しい課題もある • 設計者の意図との整合性を保つ • アーキテクチャデザインを正しく実装につなげる • 変更や修正による設計と実装のギャップをなくす public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observero){ … } public void removeObserver(Observero){ … } public void notify(){ Iteratori = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update(this); } } public void setState(Strings){ state = s; } public String getState() {return state; } } Archface Program Code • Archfaceによって設計と実装をつなぐ Bug
目次 • アーキテクチャ設計の課題 • Archface • Archface for Java • 議論と関連研究 • まとめと今後の課題
アーキテクチャ設計と実装のギャップ アーキテクチャデザイン (Observerパターン) Subjectの状態がsetState()により変更されると notify()によってObserverへ通知 setState()が呼ばれた後にはnotify()が呼ばれる public class Subject { private String state = ""; public String getState() { return state; } … } Bug public void setState(Strings) { state = s; } プログラムコード notifyの処理を行っていない
設計の詳細化では解決できない 一つの解決策としては… 完全なコードを生成 public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observero){ … } public void removeObserver(Observero){ … } public void notify(){ Iteratori = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update(this); } } public void setState(Strings){ state = s; } public String getState() {return state; } } Detailed Model Descriptions Program Code 詳細設計モデルを生成 しかし、アーキテクチャ設計は抽象的でなければならない
解決すべき課題 • アーキテクチャ設計の抽象度 • 抽象度が高すぎるとコードとの乖離が大きくなる • 抽象度が低すぎると実装との差異が無くなる • 設計からコードへの洗練 • 設計の意図を正確にプログラム実装に反映させる • 設計とコードの同期 • 設計に変更があった場合、コードを修正 • コードに変更があった場合、設計を修正
アプローチ:インターフェースとしてアーキテクチャを記述するアプローチ:インターフェースとしてアーキテクチャを記述する • Archface: アーキテクチャをインターフェースに記述し、 実装時にインプリメントすることで、 アーキテクチャを実装へ正確に引き継ぐ Architecture • コンポーネントインターフェース • コンポーネントの仕様を公開 • コネクタインターフェース • コンポーネントの連結を定義 ADLとプログラミング言語の両方の性質を持つ public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observero){ … } public void removeObserver(Observero){ … } public void notify(){ Iteratori = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update(this); } } public void setState(Strings){ state = s; } public String getState() {return state; } } Archface ●アーキテクチャを記述 =ADL Program Code ●インターフェースとして機能 =プログラミング言語
Archfaceによるアーキテクチャ設計:協調動作が表現できるArchfaceによるアーキテクチャ設計:協調動作が表現できる • 対象:Component-and-Connector アーキテクチャ • 支援内容:プログラムポイントの公開、連結、協調動作の定義 Subject Observer • コンポーネントの定義 setState × • プログラムポイントの公開 × cflow getState updateState cflow × ※プログラムポイント=プログラム上の実行点(OOPにおけるメソッド実行点) • ポートによるコンポーネントの連結 × × notifyObservers update • コントロールフローによるコンポーネント間の協調動作 出力ポート:プログラムポイントの出力 入力ポート:プログラムポイントの入力 10
モデル基盤:AOP、3部モデリングフレームワークを応用モデル基盤:AOP、3部モデリングフレームワークを応用 2つの関心事とコーディネーションの 3要素から構成される Join point Three-part Modeling Framework [Masuhara, et al. 2003]
ADLとしてのArchface:アーキテクチャ記述=ポートとコネクタの定義ADLとしてのArchface:アーキテクチャ記述=ポートとコネクタの定義 Observerパターン Subject Observer setState実行後にそのコントロールフロー下でupdateを実行する setState cflow getState updateState cflow コンポーネント インターフェース [Port update] pointcut update(): execution(void update()); ※updateメソッドの実行点を出力ポートとして公開 notifyObservers update [Port notifyObservers] pointcutnotifyObservers() : cflow(execution(voidsetState(Strings))) && call(void notify()); ※setStateを実行し、そのコントロールフロー下でnotifyを呼び出す点を 入力ポートとして公開 [Connection] connects notifyChange (port1 :cSubject.notifyObservers, port2 :cObserver.update){ around() void :port1 { port2.proceed(); } } ※notifyObserversとupdateの2つのポートを連結 ADL コネクタ インターフェース
プログラムインターフェースとしてのArchface:Archfaceの実装=プログラムポイントの公開とフローの遵守プログラムインターフェースとしてのArchface:Archfaceの実装=プログラムポイントの公開とフローの遵守 Archface (プログラムインターフェース) プログラムコード (プログラムポイントを公開するように実装) × プログラムポイント setStateを公開している コンパイルエラーにより通知=アーキテクチャに沿う実装を保証 Implement setStateからnotifyに到達する過程は問わない =Archfaceには実装が含まれない
4.議論と関連研究 15
Archfaceによる課題の解決 • アーキテクチャ設計の抽象度 • インターフェースとしてアーキテクチャをカプセル化 • 設計からコードへの洗練 • インターフェースに沿ったコーディング • 設計とコードの同期 • インターフェースを通じた設計とコードの同期
関連研究 • ArchJava [Aldrich, J. 2002] • アーキテクチャとプログラム実装を統合 • 実装がアーキテクチャ制約と適合することを保証 • Design pattern implementation in Java and AspectJ [Hannemann, J. 2002] • アーキテクチャを抽象クラス間の協調動作として記述 • AspectJを用いてデザインパターンをアスペクトとして分離 • Co-evolution between design and implementation [D'Hondt, T. 2001] • アーキテクチャデザインと実装の共進化
5.まとめと今後の課題 18
まとめと今後の課題 • Archface: • アーキテクチャ設計とプログラム実装をつなぐインターフェース機構 • プログラムポイントのコーディネーションをインターフェースに記述 • ADLとプログラミング言語の両方の性質を持つ • 今後の課題 • 他のアーキテクチャ記述(データフロー、イベントトレースなど) • それに基づくポイントカットの導入