MDA+AOP、その目的と動向

Download Report

Transcript MDA+AOP、その目的と動向

組込みソフトウェアシンポジウム ESS 2004
アスペクト指向
ソフトウェア開発
九州工業大学
情報工学部 知能情報工学科
鵜林尚靖
2004年10月15日
1
内容






アスペクト指向が生まれた背景
アスペクト指向の考え方
様々なアスペクト指向メカニズム
アスペクト指向の適用事例
アスペクト指向とMDA
アスペクト指向の今後
2
1.アスペクト指向が
生まれた背景
3
ソフトウェア開発手法の変遷
60 年代
70 年代
80 年代
90 年代
2000 年代
構造化手法
構造化プログラミング
構造化分析
構造化設計
オブジェクト指向手法
OOP
OOA
OOD
パターン
フレームワーク
コンポーネント
EA
プロダクトライン
アジャイル, XP
MDA
アスペクト指向
4
アスペクト指向とは何?
一言でいうと
「モジュール化メカニズム」の一つ
5
モジュール化メカニズムの歴史
構造化
機能中心のため、データの変更に対して脆い
データ抽象
データとそれに関連する操作をまとめてしまおう
抽象データ型
データとそれに関連する操作をまとめて型にしよう
オブジェクト指向
継承機構も入れて、再利用性を高めよう
6
モジュール化メカニズムの発展
~ 構造化 から オブジェクト指向 へ ~
操 作
操 作
操 作
オブジェクト
操 作
データ
データ
操 作
データ
操 作
操 作
データ
操 作
データ
オブジェクト
オブジェクト
操 作
操 作
データ
操 作
データ
データ
構造化
データを変更すると周りの
操作に影響が波及する
オブジェクト指向
変更の影響範囲が
オブジェクト内に
カプセル化される
7
モジュール化の理想像
ソフトウェア構造
要求分析
設計
実装
問題
領域
分析時の
関心事
設計時の
関心事
モジュールの
構成
問題領域の構造がソフトウェア構造に対応する
ソフトウェア構造を構成する関心事を自然にモジュール化できる
(関心事の分離 “Separation of Concerns” Edsger Wybe Dijkstra )
8
良いモジュール化
org.apache.tomcat におけるXML parsing
– 赤い線はXML parsingを行うコード行を示す
機能要件を
きれいにモジュール化
– 1箇所にモジュール化されている
AspectJ. http://eclipse.org/aspectj/より抜粋
9
しかし、ログ処理の場合は...
複数のオブジェクトにまたがる
(Crosscutting Concerns)
org.apache.tomcat におけるログ処理
– 赤い線はログ処理を行うコード行を示す
– 1箇所ではない
– しかも、数多くの場所に分散している(tangling and scattering)
AspectJ. http://eclipse.org/aspectj/より抜粋
10
現実のモジュール化は...
ソフトウェア構造
要求分析
設計
実装
問題
領域
分析時の
関心事
設計時の
関心事
モジュールの
構成
(問題意識)
上流の関心事が、下流に行くにしたがって構造的に分散してしまう
(オブジェクト指向でも解決できない問題がある)
11
オブジェクト指向の限界
オブジェクト指向プログラミングは、機能要件のカプセル化には優れているが、
横断的関心事( Crosscutting Concerns )の表現には必ずしも向いていない。
<横断的関心事の例>
・エラーチェック戦略
・セキュリティ
・デザインパターン
・同期制御
・資源共有
・分散にかかわる関心事
・性能最適化
性能最適化のためのコードを追加しようとする
と、コードが複数のオブジェクトに分散してしま
い、見通しの悪いプログラムになってしまう。
「分かりやすく性能も良い」プログラムを作る
のが難しい。
AOP
12
組込みソフトウェア設計の難しさ



現在のソフトウェア技術では、機能的合成可
能性が物理的合成可能性を意味するものでは
ない。
実際、物理特性は合成可能ではない。むしろ、
開発プロセスにおいて、横断的制約(crosscutting constraints)として現れる。
このような横断的制約は設計をやり難くして
しまう可能性がある。
Janos Sztipanovits and Gabor Karsai:
Generative Programming for Embedded Systems,
GPCE2002, LNCS2487, pp.32--49, 2002
13
組込みソフトウェアの構造
最適化
メモリ容量
HW特性
応答性
きれいなプログラムを作成したい!
でも、HW特性、性能向上、例外のためのコードを追加すると
どんどんプログラムが汚くなってしまう。。。
アスペクト指向
14
アスペクト指向を実現する
言語処理系、システム






AspectJ (Gregor Kiczales, et.al.)
Hyper/J (Harold Ossher, et.al.)
DemeterJ (Karl J. Lieberherr, et.al.)
Composition filters (Mehmet Aksit, et.al.)
JBoss-AOP
AspectWerkz など多数
15
2.アスペクト指向の
考え方
~ AspectJ を中心に ~
16
AspectJ



最も代表的なAOP言語
AOPの基本的な考え方をJava上に実
現した言語
元々はPARCで開発。現在はEclip
seプロジェクトに移管。
AspectJ: http://eclipse.org/aspectj/
17
開発環境: AJDT
Eclipse Tools Projectの1つ。
AJDT(AspectJ Development Tools)は、AspectJを用いた
アスペクト指向開発を支援するためのツールをEclipse上に
提供する。
AJDTを用いることにより、JDT(Java Development Tools)
上でAspectJの機能が使用できるようになる。
AJDT:
http://eclipse.org/ajdt/
18
AspectJによるプログラミング方式
同期制御、資源共有、性能最適化など複数のオブジェクトにま
たがる関心事をアスペクトというモジュール概念を用いて記述
オブジェクト
(通常の機能)
weaver
プログラム
アスペクト
(オブジェクトに
またがる関心事)
・複数のオブジェクトにまたがる関心事を見通しよく記述できる!
・「分かりやすく性能も良い」プログラムが作れる!
19
AspectJの主要概念
振る舞いへの作用
ジョインポイント(join point)
ポイントカット(pointcut)
アドバイス(advice)
構造への作用
インタータイプ定義
declare句による宣言
20
簡単なAspectJプログラム
アスペクト
HelloWorld.java
public class HelloWorld {
public static void main ( String [], args) {
HelloWorld app = new HelloWorld ();
app.hello();
}
Trace.java
インタータイプ
定義
public aspect Trace {
private String HelloWorld.mes = “トレース”;
ポイントカット
public pointcut atHello() :
call (void HelloWorld.hello());
void hello() {
System.out.println(“こんにちは!”);
}
before(HelloWorld h) : atHello() && target(h) {
System.out.println(h.mes + “呼び出し前”);
}
}
after(HelloWorld h) : atHello() && target(h) {
System.out.println(h.mes + “呼び出し後”);
}
}
アドバイス
「AspectJによるアスペクト指向プログラミング入門」
長瀬、天野、鷲崎、立堀(著) より
21
JPM(Join Point Model)
public aspect Trace {
private String HelloWorld.mes = “トレース”;
public pointcut atHello() :
call (void HelloWorld.hello());
before(HelloWorld h) : atHello() && target(h) {
System.out.println(h.mes + “呼び出し前”);
}
after(HelloWorld h) : atHello() && target(h) {
System.out.println(h.mes + “呼び出し後”);
}
メソッド呼び出し、
変数参照/更新など
の実行点を捕まえる
}
weaving
トレースコードの
埋め込み
(advice)
プログラム上の
様々な実行点
(join point)
実行点の取り出し
(pointcut)
実行点の中から
トレース処理に関
わる部分を抽出
22
実用的な例:
簡易図形エディタ
Display
* FigureElement
Figure
makePoint(..)
makeLine(..)
Point
getX()
getY()
setX(int)
setY(int)
moveBy(int, int)
moveBy(int, int)
2
Line
getP1()
getP2()
setP1(Point)
setP2(Point)
moveBy(int, int)
operations that
move elements
AspectJ. http://eclipse.org/aspectj/より抜粋
23
通常の保守、改良
class Line {
class Line {
private Point p1, p2;
private Point p1, p2;
Point getP1() { return p1; }
Point getP2() { return p2; }
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1) {
this.p1 = p1;
void setP1(Point p1) {
this.p1 = p1;
Display.update(this);
}
void setP2(Point p2) {
this.p2 = p2;
Display.update(this);
}
}
void setP2(Point p2) {
this.p2 = p2;
}
}
}
class Point
{
class Point
private int x = 0, y = 0;
private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
int getX() { return x; }
int getY() { return y; }
void setX(int x) {
this.x = x;
void setX(int x) {
this.x = x;
Display.update(this);
}
void setY(int y) {
this.y = y;
Display.update(this);
}
}
void setY(int y) {
this.y = y;
}
}
{
変更が複数の
クラスに散らば
ってしまう!
}
AspectJ. http://eclipse.org/aspectj/より抜粋
24
AspectJによる保守、改良
class Line {
aspect DisplayUpdating {
private Point p1, p2;
pointcut move(FigureElement figElt):
target(figElt) &&
(call(void FigureElement.moveBy(int, int) ||
call(void Line.setP1(Point))
||
call(void Line.setP2(Point))
||
call(void Point.setX(int))
||
call(void Point.setY(int)));
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1) {
this.p1 = p1;
}
void setP2(Point p2) {
this.p2 = p2;
}
after(FigureElement fe) returning: move(fe) {
Display.update(fe);
}
}
class Point
{
private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
void setX(int x) {
this.x = x;
}
void setY(int y) {
this.y = y;
}
}
}
(set* のような記述も可能)
変更が1つのアスペクトに局所化される!
予期しないソフトウェア発展に有効!
(unanticipated software evolution)
AspectJ. http://eclipse.org/aspectj/より抜粋
25
クラスを横断するアスペクト
Display
* FigureElement
Figure
makePoint(..)
makeLine(..)
Point
getX()
getY()
setX(int)
setY(int)
moveBy(int, int)
moveBy(int, int)
2
Line
getP1()
getP2()
setP1(Point)
setP2(Point)
moveBy(int, int)
DisplayUpdating
AspectJ. http://eclipse.org/aspectj/より抜粋
26
3.様々なアスペクト
指向
メカニズム
27
様々なアスペクト指向メカニズム
アスペクト指向 = AspectJ ではない!
たとえば、
PA (AspectJ流 pointcut & advice)
TRAV (DemeterJ流 traversal specifications)
COMPOSITOR (Hyper/J流 class hierarchy composition)
OC (AspectJ 流 open classes )
※用語は以下のものに準拠
Hidehiko Masuhara and Gregor Kiczales:
Modeling Crosscutting in Aspect-Oriented Mechanisms, ECOOP 2003
28
http://www.cs.ubc.ca/labs/spl/projects/asb.html
ASB
ASB(Aspect Sand Box)
4つのアスペクト指向メカニズムをモデル化
4つのインタプリタを提供
ここでは、ASBのサンプルプログラム(※)を提示しながら
4つのアスペクト指向メカニズムを紹介する
※ 元々のプログラムはSchemeライクな言語であるが、ここでは、
分かりやすさを考慮してJavaライクな 言語で説明する
※ 以下の論文からの引用
Hidehiko Masuhara and Gregor Kiczales:
Modeling Crosscutting in Aspect-Oriented Mechanisms, ECOOP 2003
29
基盤となる例題プログラム
簡易図形エディタ
30
PA (AspectJ流 Point
cut & Advice)
ASBサンプルプログラム
after (FigureElement fe):
( call(void Point.setX(int))
|| call(void Point.setY(int))
|| call(void Line.setP1(Point))
|| call(void Line.setP2(Point)))
&& target(fe){
fe.display.update(fe);
31
TRAV
(DemeterJ流)
Northeastern大学で開発されたツール/ライブラリで、Javaに
よるAdaptive Programmingを支援する
ASBサンプルプログラム
Visitor counter = new CountElementsVisitor();
traverse("from Figure to FigureElement",
fig,
counter);
fig
[Visitor]
Counter
traverse 仕様に則り、
オブジェクト木を訪問し、
Visitor メソッドを実行
Point
32
COMPOSITOR
J流)
(Hyper
Hyper/Jとは

IBM T.J Watson Research Centerで開発された
Javaベースの言語。

SOP(Subject-oriented programming)およびその
後継の MDSOC(Multi-Dimensional Separation
Of Concerns)という考え方に基づいている。

すべてを関心事(クラスで表現)としてプログラミ
ングする方式。AspectJのようにアスペクトとクラ
スといった区分がない。

ソフトウェアのevolutionへの柔軟な対応を重視。
33
つづき
ASBサンプルプログラム
class Observable {
Display display;
void moved() {
display.update(this);
}
}
; relationship between Point/Line and Observable
match Point.setX with Observable.moved
match Point.setY with Observable.moved
match Line.setP1 with Observable.moved
match Line.setP2 with Observable.moved
34
OC (AspectJ流 Open
Class)
AspectJ の インタータイプ定義
ASBサンプルプログラム
class DisplayMethods {
void Point.draw() { Graphics.drawOval(...); }
void Line.draw() { Graphics.drawLine(...); }
}
35
疑問...
PA
TRAV
COMPOSITOR
OC
同じアスペクト指向と言っても
全然違うではないか?
これらに共通するものは
あるのか?
36
Three-Part Model
Aprogram
META weaving
parameter
Bprogram
XJPjoin point
X - computation
or program
Hidehiko Masuhara and Gregor Kiczales:
Modeling Crosscutting in Aspect-Oriented Mechanisms, ECOOP 2003
37
Three-Part Model (つ
づき)
c, m, f: class, method, field の略
38
4.アスペクト指向の
適用事例
39
アスペクト指向の適用事例
デバッグやロギングについてはメリットは分かるが、
それ以外の応用はどうなのか?
デザインパターンへの応用
[Hannemann他02]
データベースへの応用
[Rashid他03]
FreeBSDカーネルの最適化コードをAOPで分離
[Coady他02,03]
WebSphereのコードをAOPで分離
[Coyler04]
40
事例1:
デザインパターンへの応用
Jan Hannemann and Gregor Kiczales:
Design Pattern Implementation in Java and AspectJ,
OOPSLA2002 (2002)
AspectJを持いて、GoFデザインパターンの記述を改良
41
Observer パターン
Subject
Attach(Observer)
Detach(Observer)
Notify()
*
1
o
Observer
Update()
for(;全てのObserver;)
{o->Update();}
1
1
ConcreteSubject
subject
ConcreteObserver
subjectState:State*
observerState:State*
GetState()
Update()
return subjectState;
observerState
= Subject->GetState();
42
Observer パターンの適用例
Jan Hannemann and Gregor Kiczales:
Design Pattern Implementation in Java and AspectJ,
OOPSLA2002 (2002) より引用
43
Observerパターンの汎用アス
ペクト
抽象ポイントカット
抽象アスペクト
インタフェース
アドバイス
Jan Hannemann and Gregor Kiczales:
Design Pattern Implementation in Java and AspectJ,
OOPSLA2002 (2002) より引用
44
実際のプログラムへの適用
具象ポイントカット
Jan Hannemann and Gregor Kiczales:
Design Pattern Implementation in Java and AspectJ,
OOPSLA2002 (2002) より引用
45
事例2:
データベースへの応用
永続性(Persistence)は横断的関心事の1つ
アスペクト指向により、永続性をモジュール化したい
永続アスペクトを再利用したい
永続性のことを気にせずにアプリケーションを開発したい
Aspect-Oriented Database
Awais Rashid and Ruzanna Chitchyan:
"Persistence as an aspect", AOSD2003
46
アスペクト化された永続性(1)
例: 文献管理アプリケーション
データアクセスに関わる
join pointを抽出し、そこに
DB処理のためのコードを
weavingする
47
アスペクト化された永続性(2)
AspectJ による記述
public class PersistentRoot {
protected boolean isDeleted = false;
public void delete() {
this.isDeleted = true;
}
public boolean isDeleted() {
return this.isDeleted;
}
}
public abstract aspect DatabaseAccess {
private static Connection dbConnection;
private static String dbURL;
abstract pointcut establishConnection();
abstract pointcut closeConnection();
public abstract String getDatabaseURL();
public abstract String getDriverName();
Connection
Storage &
Update
pointcut trapInstantiation() : call(PersistentRoot+.new(..));
pointcut trapUpdates(PersistentRoot obj) :
!cflow(call(public static Vector
SQLTranslation.getObjects(ResultSet, String))) &&
(this(obj) &&
execution(public void PersistentRoot+.set*(..)));
public aspect ApplicationDatabaseAccess {
declare patents: (BibliographyItem ||
AuthorEditor ||
Publisher ||
PublisherLocation)
extends PersistentRoot;
pointcut trapRetrievals() : call(Vector PersistentData.get*(..));
public static PersistentData getPersistentData() { … }
:
:
// other code
}
Retrieval
// advice code
}
48
アスペクトベースの永続化フレーム
ワーク
<<aspect>>
SQLTrajnslation
<<use>>
<<aspect>>
MetaData Access
永続化フレームワーク
アプリケーション
<<use>>
Lookup Table
<<aspect>>
Data Access
<<use>>
Persistent Data
<<use>>
<<aspect>>
Establish Mapping
Application
specific
customisation
<<aspect>>
Application
Database Access
Persistent Data
Implimentation
Weaving
永続性の部分をアスペクト化することにより、アプリケーションは永続性のことを気にせず
に開発できる(一部例外あり)。
49
5.アスペクト指向と
MDA
50
MDA(Model-Driven Architecture)とは
実装技術(J2EEや.NETなど)から分析/設計を
独立させ、設計情報が実装技術に左右されないよ
うにする技術
分析/設計部分はプラットフォームに
依存しない為、再利用可能
UML2の目玉
51
MDAと従来プロセスの違い
従来の開発
MDAによる開発
分析
CIM
PIM
設計
PSM
コーディング
設計フェーズが
大きく変化!
モデルコンパイラ
による自動変換
ソース・コード
CIM: Computation Independent Model
PIM: Platform Independent Model
PSM: Platform Specific Model
52
モデル変換の例(Strutsの場
合)
ステップ1: 複数PIMの合成
①PIMクラスのマージ
ステップ2: アクションフォーム
Beanへの変換
②Bean規約名に変更
③ActionFormを継承
④setter/getterを追加
ステップ3: アクションクラス
の新規作成
⑤アクションクラスを生成
⑥Actionを継承
⑦executeメソッドを追加
⑧メソッド本体を追加
PIM
PSM
53
MDAのメリット

コード中心開発からモデル中心開発へパラダイムシ
フト: 開発者は特定のプラットフォームやプログ
ラミング技術にとらわれることなく、PIMの開発に
全力を注ぐことができる。

新しいタイプのコンポーネント化: PIMモデル部
品とモデル変換規則をライブラリ化することにより、
様々な機能やプラットフォームに対応したプロダク
ト群を生成することが可能になり、プロダクトライ
ン型開発の実現につながる。
54
MDA実現のための鍵


厳密なモデル表記 (MOF、OCL)
厳密なモデル変換定義 (QVT)
QVTの例
mapping Simple_Class_To_Java_Class
refine Simple_Class_And_Java_Class {
domain {(SM.Class)[name = n, attributes = A] }
body {
(JM.Class)[
name = n,
attributes = A->iterate(a as ={} |
as + Simple_Attribute_To_Java_Attribute(a))
]
}
}
MOF: Meta Object Facility
OCL: Object Constraint Language
QVT: Queries, Views, and Transformations
55
MDAとアスペクト指向
PIMモデル(UML)
アプリケーション
weaving
実装環境対応コード
アプリケーション
実装環境対応コード
マッピングルール(MOF QVT)
アスペクト記述言語
「AspectJによるアスペクト指向プログラミング入門」
長瀬、天野、鷲崎、立堀(著) より
56
当研究室の研究紹介:
AspectMモデルコンパイラ
アスペクト
アスペクト
アスペクト図
(モデル変換モジュール
(モデル変換モジュール
(モデル変換モジュール
としてのアスペクト)
としてのアスペクト)
としてのアスペクト)
XML
アスペクトを追加する
ことにより様々な変換
を可能にする
UMLモデル
(クラス図)
XML
weave
UMLモデル
(クラス図)
モデルコンパイラ
XML
アスペクト図
(システム構成モジュール
としてのアスペクト)
XML
アスペクト指向メカニズムにより
モデルコンパイラを実現!
57
AspectMにおけるJPM

JPMでモデル変換を記述
Join Point
クラス名
Advice
クラス名
属性
・・・
属性①
属性②
操作
・・・
操作
・・・
クラス図
Point Cut
58
モデル変換のためのJPM
モデル変換機能
操作本体の変更
クラスのマージ
クラスの追加/削除
PA
CM
NE
OC
RN
RL
○
①PIMクラスのマージ
CM
②Bean規約名に変更
○
RN
○
③ActionFormを継承
操作の追加/削除
○
属性の追加/削除
○
RL
④setter/getterを追加
クラス名の変更
○
操作名の変更
○
属性名の変更
○
OC
⑤アクションクラスを生成
NE
⑥Actionを継承
継承の追加/削除
○
集約の追加/削除
○
関連の追加/削除
○
PA(pointcut & advice),CM(composition),NE(new element),
OC(open class),RN(rename),RL(relation)
RL
⑦executeメソッドを追加
OC
⑧メソッド本体を追加
PA
59
MessageクラスとMessageProfileクラスを
AspectMの記述例
マージしてPostMessageクラスに変換
aspect
<< CM >>
merge-message-classes
message-classes : class
{ Message || MessageProfile }
merge-message-classes [message-classes]
: merge-by-name
{ PostMessage }
<aspect name="merge-message-classes" type="CM" >
<pointcut name="message-classes" type="class"> Message || MessageProfile </pointcut>
<advice name="merge-message-classes" type="merge-by-name">
<ref-pointcut> message-classes </ref-pointcut>
<advice-body>
<element> PostMessage</element>
</advice-body>
</advice>
</aspect>
60
6.アスペクト指向の
今後
61
アスペクト指向の今後


現在、プログラミング周りで研究が活発(8
0年代のOOP研究を彷彿させる)
今後は、適用事例の拡大、開発方法論の整備、
アスペクトコンポーネント・フレームワーク
の整備に向かって行くと思われる(90年代
のOOソフトウェアエンジアリングの発展に
類似)
歴史は繰り返す...
62
AOSD ソフト開発工程全体への波及
AOP(Aspect-Oriented Programming)
から
AOSD(Aspect-Oriented Software Development)
へ
AO: Aspect-Oriented
要求分析
Early Aspect
設計
AO
Design Pattern
AO
Modeling
Aspect
Mining
AO
Framework
実装
AO
Language
AO
Component
AO
Database
63
上流段階のアスペクト研究例
Stein他[AOSD2002]
アスペクトをUML図として表現する方法を提案
モデリング段階のアスペクトはAspectJなどのAOP言語に変換
するもので、この方法ではMDAは実現できない
AspectMのアスペクトはUML図自身を操作するもの
Gray他[GPCE2003]
AODM(Aspect-Oriented Domain Modeling)を提案
属性や関連などのモデル要素を追加する機能をもつ
MDAなどの一般的なモデル変換を対象にしたものではない
Sillito他[ECOOP2004]
ユースケースレベルのポイントカットを提案
上流のモデリング段階においてもJPMの考え方が有効であるこ
とを示した
64
アスペクト指向言語の変遷
ドメイン専用AOP言語を個々に開発するアプローチ
(1997年頃まで)
Weaverを開発するのが大変
汎用AOP言語(AspectJ等: 「Pointcut+Advice」メカニズ
ム)のアプローチ
(現在)
適用範囲が限定される
拡張可能ドメイン専用AOP言語の(Xaspect等)アプローチ
(これから)
65
アスペクト指向に関する情報源
ポータルサイト
http://aosd.net
国際会議
Aspect-Oriented Software Development (AOSD)
OOPSLA, ECOOP, GPCE, ICSE, FSE, ICFP など
66
おわり
67