アーキテクチャ設計と実装をつなぐ インターフェース機構 Archface Archface: An Interface Mechanism for Bridging a Gap between Architectural Design and Implementation 九州工業大学大学院 情報工学府 野村 潤 鵜林 尚靖 1 概要 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によって設計と実装をつなぐ Bug 2 目次 1. アーキテクチャ設計の課題 2. Archface 3. Archface for Java 4. 議論と関連研究 5. まとめと今後の課題 3 4 1.アーキテクチャ設計の課題 4 アーキテクチャ設計と実装のギャップ アーキテクチャデザイン (Observerパターン) Subjectの状態がsetState()により変更されると notify()によってObserverへ通知 setState()が呼ばれた後には notify()が呼ばれる public class Subject { Bug private String state = ""; public String getState() { return state; } public void setState(String s) { state = s; } … プログラムコード } notifyの処理を行っていない 5 設計の詳細化では解決できない 一つの解決策としては… 完全なコードを生成 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; } } 詳細設計モデルを生成 しかし、アーキテクチャ設計は抽象的でなければならない 6 解決すべき課題 アーキテクチャ設計の抽象度 抽象度が高すぎるとコードとの乖離が大きくなる 抽象度が低すぎると実装との差異が無くなる 設計からコードへの洗練 設計の意図を正確にプログラム実装に反映させる 設計とコードの同期 設計に変更があった場合、コードを修正 コードに変更があった場合、設計を修正 7 8 2.Archface ( = Architecture + Interface) 8 アプローチ: インターフェースとしてアーキテクチャを記述する Archface: アーキテクチャをインターフェースに記述し、 実装時にインプリメントすることで、 アーキテクチャを実装へ正確に引き継ぐ Archface ADLとプログラミング言語の両方の性質を持つ コンポーネントインターフェース •コンポーネントの仕様を公開 コネクタインターフェース •コンポーネントの連結を定義 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; } } ●アーキテクチャを記述 =ADL ●インターフェースとして機能 =プログラミング言語 9 Archfaceによるアーキテクチャ設計: 協調動作が表現できる 対象:Component-and-Connector アーキテクチャ 支援内容:プログラムポイントの公開、連結、協調動作の定義 Subject Observer コンポーネントの定義 × setState × cflow × × getState updateState cflow × notifyObservers update 出力ポート:プログラムポイントの出力 プログラムポイントの公開 ※プログラムポイント=プログラム上の 実行点(OOPにおけるメソッド実行点) ポートによるコンポーネン トの連結 コントロールフローによるコ ンポーネント間の協調動作 入力ポート:プログラムポイントの入力 10 モデル基盤: AOP、3部モデリングフレームワークを応用 2つの関心事とコーディネーションの 3要素から構成される Join point Three-part Modeling Framework [Masuhara, et al. 2003] 11 12 3.Archface for Java 12 ADLとしてのArchface: アーキテクチャ記述=ポートとコネクタの定義 Subject Observerパターン Observer setState実行後にそのコントロー ルフロー下でupdateを実行する setState cflow getState updateState cflow コンポーネント インターフェー notifyObservers updateス [Port notifyObservers] [Connection] [Port update] pointcut update(): execution(void update()); pointcut notifyObservers() : connects notifyChange ※updateメソッドの実行点を cflow(execution(void setState(String s))) && call(void notify()); (port1 :cSubject.notifyObservers, 出力ポートとして公開 port2 :cObserver.update){ ※setStateを実行し、そのコントロールフロー下でnotifyを呼び出す点を around() void :port1 { port2.proceed(); } 入力ポートとして公開 } ADL コネクタ ※notifyObserversとupdateの2つのポートを連結 インターフェース 13 プログラムインターフェースとしてのArchface: Archfaceの実装=プログラムポイントの公開とフローの遵守 Archface (プログラムインターフェース) プログラムコード (プログラムポイントを公開するように実装) × プログラムポイント setStateを公開している コンパイルエラーにより通知 =アーキテクチャに沿う実装を保証 Implement setStateからnotifyに到達する過程は問わない =Archfaceには実装が含まれない 14 15 4.議論と関連研究 15 Archfaceによる課題の解決 1) アーキテクチャ設計の抽象度 インターフェースとしてアーキテクチャをカプセル化 2) 設計からコードへの洗練 インターフェースに沿ったコーディング 3) 設計とコードの同期 インターフェースを通じた設計とコードの同期 16 関連研究 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] アーキテクチャデザインと実装の共進化 17 18 5.まとめと今後の課題 18 まとめと今後の課題 Archface: アーキテクチャ設計とプログラム実装をつなぐ インターフェース機構 プログラムポイントのコーディネーションをインター フェースに記述 ADLとプログラミング言語の両方の性質を持つ 今後の課題 他のアーキテクチャ記述(データフロー、イベントトレー スなど) それに基づくポイントカットの導入 19 20 ご清聴ありがとうございました 20
© Copyright 2024 ExpyDoc