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