Transcript Archface
アーキテクチャ設計と実装をつなぐ
インターフェース機構 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