Transcript Archface
アーキテクチャ設計をカプセル化する
インターフェース機構 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