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