九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2004年10月15日

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也. 講義計画(あくまで予定) 第 1 回 プログラミング言語の種類と歴史 第 2 回 eclipse の基本操作 第 3 回 eclipse のデバッグ機能 第 4 回 構造化プログラミングの復習 第 5 回 演習 第 6 回 構造化指向からオブジェクト指向へ.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
メタモデル記述を用いた成果物間の依存関係追跡手法
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2005年7月16日
アスペクト指向プログラミングに 関する十の神話
Dynamic AOPと その実装手法について
ソフトウェア工学 知能情報学部 新田直也.
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
AspectScope によるアスペクトとクラスのつながりの視覚化
C#とC++とオブジェクト指向 上甲 健史.
UML入門 UML PRESS vol.1 より 時松誠治 2003年5月19日.
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
ソフトウェア開発手法の最前線 ~ アスペクト指向、MDA、MIC ~
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
社会シミュレーションのための モデル作成環境
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.
プログラミング言語論 第十四回 理工学部 情報システム工学科 新田直也.
UMLモデルを対象とした リファクタリング候補検出の試み
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
契約による クラスとアスペクト間の 影響解析
UMLの概要とオブジェクト指向の基本概念
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
拡張可能なアスペクト指向モデリングにおける織り合わせの検証
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
様々なAOPメカニズムをモデル化する パラメータ化インタプリタ
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ソフトウェア工学 知能情報学部 新田直也.
ソフトウェア工学 理工学部 情報システム工学科 新田直也.
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
開発者との対話を活かした 横断的構造の表現
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
1.2 言語処理の諸観点 (1)言語処理の利用分野
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2004年10月15日 組込みソフトウェアシンポジウム ESS 2004 アスペクト指向 ソフトウェア開発 九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2004年10月15日

内容 アスペクト指向が生まれた背景 アスペクト指向の考え方 様々なアスペクト指向メカニズム アスペクト指向の適用事例 アスペクト指向とMDA アスペクト指向の今後

1.アスペクト指向が   生まれた背景

ソフトウェア開発手法の変遷 構造化手法 オブジェクト指向手法 アスペクト指向 60 年代 70 年代 80 年代 90 年代 2000 年代 構造化プログラミング 構造化分析 構造化設計 OOP OOA OOD パターン フレームワーク コンポーネント EA プロダクトライン アジャイル, XP MDA アスペクト指向

アスペクト指向とは何? 一言でいうと 「モジュール化メカニズム」の一つ

モジュール化メカニズムの歴史 構造化 機能中心のため、データの変更に対して脆い データ抽象 データとそれに関連する操作をまとめてしまおう 抽象データ型 データとそれに関連する操作をまとめて型にしよう オブジェクト指向 継承機構も入れて、再利用性を高めよう

モジュール化メカニズムの発展 ~ 構造化 から オブジェクト指向 へ ~ モジュール化メカニズムの発展  ~ 構造化 から オブジェクト指向 へ ~ 操 作 操 作 オブジェクト 操 作 操 作 データ データ 操 作 データ データ データ 操 作 オブジェクト 操 作 操 作 操 作 オブジェクト 操 作 データ 操 作 データ データ オブジェクト指向 構造化 変更の影響範囲が オブジェクト内に カプセル化される データを変更すると周りの 操作に影響が波及する

モジュール化の理想像 問題領域の構造がソフトウェア構造に対応する ソフトウェア構造を構成する関心事を自然にモジュール化できる 要求分析 設計 実装 問題 領域 分析時の 関心事 設計時の 関心事 モジュールの 構成 問題領域の構造がソフトウェア構造に対応する ソフトウェア構造を構成する関心事を自然にモジュール化できる  (関心事の分離 “Separation of Concerns” Edsger Wybe Dijkstra )

良いモジュール化 1箇所にモジュール化されている org.apache.tomcat におけるXML parsing 機能要件を きれいにモジュール化 org.apache.tomcat におけるXML parsing 赤い線はXML parsingを行うコード行を示す 1箇所にモジュール化されている AspectJ. http://eclipse.org/aspectj/より抜粋

(Crosscutting Concerns) しかし、ログ処理の場合は... 複数のオブジェクトにまたがる (Crosscutting Concerns) org.apache.tomcat におけるログ処理 赤い線はログ処理を行うコード行を示す 1箇所ではない しかも、数多くの場所に分散している(tangling and scattering) AspectJ. http://eclipse.org/aspectj/より抜粋

現実のモジュール化は... ソフトウェア構造 要求分析 設計 実装 問題 領域 (問題意識) 分析時の 関心事 設計時の 関心事 モジュールの 構成 (問題意識)  上流の関心事が、下流に行くにしたがって構造的に分散してしまう  (オブジェクト指向でも解決できない問題がある)

オブジェクト指向の限界 オブジェクト指向プログラミングは、機能要件のカプセル化には優れているが、横断的関心事( Crosscutting Concerns )の表現には必ずしも向いていない。 <横断的関心事の例> ・エラーチェック戦略 ・セキュリティ ・デザインパターン ・同期制御 ・資源共有 ・分散にかかわる関心事 ・性能最適化 性能最適化のためのコードを追加しようとすると、コードが複数のオブジェクトに分散してしまい、見通しの悪いプログラムになってしまう。「分かりやすく性能も良い」プログラムを作るのが難しい。 AOP

組込みソフトウェア設計の難しさ 現在のソフトウェア技術では、機能的合成可能性が物理的合成可能性を意味するものではない。 実際、物理特性は合成可能ではない。むしろ、開発プロセスにおいて、横断的制約(cross-cutting constraints)として現れる。 このような横断的制約は設計をやり難くしてしまう可能性がある。 Janos Sztipanovits and Gabor Karsai: Generative Programming for Embedded Systems, GPCE2002, LNCS2487, pp.32--49, 2002

組込みソフトウェアの構造 最適化 メモリ容量 HW特性 応答性 きれいなプログラムを作成したい! でも、HW特性、性能向上、例外のためのコードを追加すると どんどんプログラムが汚くなってしまう。。。 アスペクト指向

アスペクト指向を実現する 言語処理系、システム 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 など多数

2.アスペクト指向の   考え方 ~ AspectJ を中心に ~

AspectJ 最も代表的なAOP言語 AOPの基本的な考え方をJava上に実現した言語 元々はPARCで開発。現在はEclipseプロジェクトに移管。 AspectJ: http://eclipse.org/aspectj/

開発環境: AJDT Eclipse Tools Projectの1つ。 AJDT(AspectJ Development Tools)は、AspectJを用いたアスペクト指向開発を支援するためのツールをEclipse上に提供する。 AJDTを用いることにより、JDT(Java Development Tools)上でAspectJの機能が使用できるようになる。 AJDT: http://eclipse.org/ajdt/

AspectJによるプログラミング方式 同期制御、資源共有、性能最適化など複数のオブジェクトにまたがる関心事をアスペクトというモジュール概念を用いて記述 オブジェクト (通常の機能) weaver プログラム アスペクト (オブジェクトに またがる関心事) ・複数のオブジェクトにまたがる関心事を見通しよく記述できる! ・「分かりやすく性能も良い」プログラムが作れる!

AspectJの主要概念 振る舞いへの作用 ジョインポイント(join point) ポイントカット(pointcut) アドバイス(advice) 構造への作用 インタータイプ定義 declare句による宣言

簡単なAspectJプログラム HelloWorld.java Trace.java アスペクト インタータイプ 定義 HelloWorld.java Trace.java public class HelloWorld { public static void main ( String [], args) { HelloWorld app = new HelloWorld (); app.hello(); } void hello() { System.out.println(“こんにちは!”); 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 + “呼び出し後”); ポイントカット アドバイス 「AspectJによるアスペクト指向プログラミング入門」 長瀬、天野、鷲崎、立堀(著) より

実行点の中からトレース処理に関わる部分を抽出 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) 実行点の中からトレース処理に関わる部分を抽出

実用的な例: 簡易図形エディタ * operations that move elements Display Figure 実用的な例: 簡易図形エディタ Display * Figure makePoint(..) makeLine(..) FigureElement moveBy(int, int) operations that move elements Point getX() getY() setX(int) setY(int) moveBy(int, int) Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int, int) 2 AspectJ. http://eclipse.org/aspectj/より抜粋

通常の保守、改良 class Line { class Point { class Line { class Point { 変更が複数の private Point p1, p2; Point getP1() { return p1; } Point getP2() { return p2; } void setP1(Point p1) { this.p1 = p1; } void setP2(Point p2) { this.p2 = p2; 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; class Line { private Point p1, p2; Point getP1() { return p1; } Point getP2() { return p2; } void setP1(Point p1) { this.p1 = p1; Display.update(this); } void setP2(Point p2) { this.p2 = p2; 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; 変更が複数の クラスに散らば ってしまう! AspectJ. http://eclipse.org/aspectj/より抜粋

AspectJによる保守、改良 (set* のような記述も可能) 変更が1つのアスペクトに局所化される! 予期しないソフトウェア発展に有効! class Line { private Point p1, p2; Point getP1() { return p1; } Point getP2() { return p2; } void setP1(Point p1) { this.p1 = p1; } void setP2(Point p2) { this.p2 = p2; 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; aspect DisplayUpdating { 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))); after(FigureElement fe) returning: move(fe) { Display.update(fe); } (set* のような記述も可能) 変更が1つのアスペクトに局所化される! 予期しないソフトウェア発展に有効!  (unanticipated software evolution) AspectJ. http://eclipse.org/aspectj/より抜粋

クラスを横断するアスペクト * Display Figure makePoint(..) makeLine(..) FigureElement moveBy(int, int) Point getX() getY() setX(int) setY(int) moveBy(int, int) Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int, int) 2 DisplayUpdating AspectJ. http://eclipse.org/aspectj/より抜粋

3.様々なアスペクト指向   メカニズム

様々なアスペクト指向メカニズム アスペクト指向 = 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

ASB ASB(Aspect Sand Box) 4つのアスペクト指向メカニズムをモデル化 4つのインタプリタを提供 http://www.cs.ubc.ca/labs/spl/projects/asb.html ASB(Aspect Sand Box) 4つのアスペクト指向メカニズムをモデル化 4つのインタプリタを提供 ここでは、ASBのサンプルプログラム(※)を提示しながら 4つのアスペクト指向メカニズムを紹介する ※ 元々のプログラムはSchemeライクな言語であるが、ここでは、   分かりやすさを考慮してJavaライクな 言語で説明する ※ 以下の論文からの引用    Hidehiko Masuhara and Gregor Kiczales:    Modeling Crosscutting in Aspect-Oriented Mechanisms, ECOOP 2003

基盤となる例題プログラム 簡易図形エディタ

PA (AspectJ流 Pointcut & Advice) PA (AspectJ流 Pointcut & 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);

TRAV (DemeterJ流) traverse 仕様に則り、 オブジェクト木を訪問し、 Visitor メソッドを実行 TRAV (DemeterJ流) Northeastern大学で開発されたツール/ライブラリで、Javaに よるAdaptive Programmingを支援する ASBサンプルプログラム Visitor counter = new CountElementsVisitor(); traverse("from Figure to FigureElement", fig, counter); [Visitor] Counter fig traverse 仕様に則り、 オブジェクト木を訪問し、 Visitor メソッドを実行 Point

COMPOSITOR (HyperJ流) Hyper/Jとは COMPOSITOR (HyperJ流) Hyper/Jとは IBM T.J Watson Research Centerで開発されたJavaベースの言語。 SOP(Subject-oriented programming)およびその後継の MDSOC(Multi-Dimensional Separation Of Concerns)という考え方に基づいている。 すべてを関心事(クラスで表現)としてプログラミングする方式。AspectJのようにアスペクトとクラスといった区分がない。 ソフトウェアのevolutionへの柔軟な対応を重視。

つづき 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

OC (AspectJ流 Open Class) OC (AspectJ流 Open Class) AspectJ の インタータイプ定義 ASBサンプルプログラム class DisplayMethods { void Point.draw() { Graphics.drawOval(...); } void Line.draw() { Graphics.drawLine(...); } }

疑問... PA TRAV COMPOSITOR OC 同じアスペクト指向と言っても 全然違うではないか? これらに共通するものは あるのか?

Three-Part Model EFFB - means of effecting A - program B - program EFFA IDA- means of identifying IDB META - weaving parameter X - computation or program XJP- join point Hidehiko Masuhara and Gregor Kiczales:    Modeling Crosscutting in Aspect-Oriented Mechanisms, ECOOP 2003

Three-Part Model (つづき) c, m, f: class, method, field の略

4.アスペクト指向の   適用事例

アスペクト指向の適用事例 デバッグやロギングについてはメリットは分かるが、 それ以外の応用はどうなのか? デザインパターンへの応用                   [Hannemann他02] データベースへの応用 [Rashid他03] FreeBSDカーネルの最適化コードをAOPで分離                   [Coady他02,03] WebSphereのコードをAOPで分離                   [Coyler04]

事例1: デザインパターンへの応用 Jan Hannemann and Gregor Kiczales: 事例1: デザインパターンへの応用 Jan Hannemann and Gregor Kiczales: Design Pattern Implementation in Java and AspectJ, OOPSLA2002 (2002) AspectJを持いて、GoFデザインパターンの記述を改良

Observer パターン * 1 Subject Observer o Update() Attach(Observer) Detach(Observer) Notify() for(;全てのObserver;) {o->Update();} 1 1 ConcreteObserver ConcreteSubject subject observerState:State* subjectState:State* GetState() Update() observerState = Subject->GetState(); return subjectState;

Observer パターンの適用例 Jan Hannemann and Gregor Kiczales: Design Pattern Implementation in Java and AspectJ, OOPSLA2002 (2002) より引用

Observerパターンの汎用アスペクト 抽象ポイントカット 抽象アスペクト インタフェース アドバイス Jan Hannemann and Gregor Kiczales: Design Pattern Implementation in Java and AspectJ, OOPSLA2002 (2002) より引用

実際のプログラムへの適用 具象ポイントカット Jan Hannemann and Gregor Kiczales: Design Pattern Implementation in Java and AspectJ, OOPSLA2002 (2002) より引用

事例2: データベースへの応用 永続性(Persistence)は横断的関心事の1つ Aspect-Oriented Database 事例2: データベースへの応用 永続性(Persistence)は横断的関心事の1つ アスペクト指向により、永続性をモジュール化したい 永続アスペクトを再利用したい 永続性のことを気にせずにアプリケーションを開発したい Aspect-Oriented Database Awais Rashid and Ruzanna Chitchyan: "Persistence as an aspect", AOSD2003

アスペクト化された永続性(1) 例: 文献管理アプリケーション データアクセスに関わる join pointを抽出し、そこに 例: 文献管理アプリケーション データアクセスに関わる join pointを抽出し、そこに DB処理のためのコードを weavingする

アスペクト化された永続性(2) AspectJ による記述 Connection Storage & Update Retrieval 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(); 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*(..))); pointcut trapRetrievals() : call(Vector PersistentData.get*(..)); public static PersistentData getPersistentData() { … } : // advice code } public class PersistentRoot { protected boolean isDeleted = false; public void delete() { this.isDeleted = true; } public boolean isDeleted() { return this.isDeleted; public aspect ApplicationDatabaseAccess { declare patents: (BibliographyItem || AuthorEditor || Publisher || PublisherLocation) extends PersistentRoot; // other code Connection Storage & Update Retrieval

アスペクトベースの永続化フレームワーク Weaving 永続化フレームワーク アプリケーション 永続性の部分をアスペクト化することにより、アプリケーションは永続性のことを気にせずに開発できる(一部例外あり)。

5.アスペクト指向とMDA

MDA(Model-Driven Architecture)とは 実装技術(J2EEや.NETなど)から分析/設計を独立させ、設計情報が実装技術に左右されないようにする技術 分析/設計部分はプラットフォームに 依存しない為、再利用可能 UML2の目玉

MDAと従来プロセスの違い 従来の開発 MDAによる開発 設計フェーズが 大きく変化! CIM 分析 PIM 設計 PSM コーディング モデルコンパイラ による自動変換 PSM コーディング ソース・コード CIM: Computation Independent Model PIM: Platform Independent Model PSM: Platform Specific Model

モデル変換の例(Strutsの場合) ステップ1: 複数PIMの合成 ①PIMクラスのマージ ステップ2: アクションフォーム ステップ1: 複数PIMの合成 ①PIMクラスのマージ ステップ2: アクションフォーム         Beanへの変換 ②Bean規約名に変更 ③ActionFormを継承 ④setter/getterを追加 ステップ3: アクションクラス         の新規作成 ⑤アクションクラスを生成 ⑥Actionを継承 ⑦executeメソッドを追加 ⑧メソッド本体を追加 PIM PSM

MDAのメリット コード中心開発からモデル中心開発へパラダイムシフト: 開発者は特定のプラットフォームやプログラミング技術にとらわれることなく、PIMの開発に全力を注ぐことができる。 新しいタイプのコンポーネント化: PIMモデル部品とモデル変換規則をライブラリ化することにより、様々な機能やプラットフォームに対応したプロダクト群を生成することが可能になり、プロダクトライン型開発の実現につながる。

MDA実現のための鍵 厳密なモデル表記 (MOF、OCL) 厳密なモデル変換定義 (QVT) QVTの例 厳密なモデル表記 (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

MDAとアスペクト指向 PIMモデル(UML) アプリケーション 実装環境対応コード weaving アプリケーション 実装環境対応コード マッピングルール(MOF QVT) アスペクト記述言語 「AspectJによるアスペクト指向プログラミング入門」 長瀬、天野、鷲崎、立堀(著) より

当研究室の研究紹介: AspectMモデルコンパイラ アスペクト (モデル変換モジュール としてのアスペクト) アスペクト図 XML アスペクトを追加することにより様々な変換を可能にする weave UMLモデル (クラス図) UMLモデル (クラス図) XML XML モデルコンパイラ アスペクト図 (システム構成モジュール としてのアスペクト) アスペクト指向メカニズムにより モデルコンパイラを実現! XML

AspectMにおけるJPM JPMでモデル変換を記述 Join Point クラス名 Advice クラス名 Point Cut クラス図 属性 ・・・ 属性① 属性② 操作 ・・・ 操作 ・・・ Point Cut クラス図

モデル変換のためのJPM ①PIMクラスのマージ CM ②Bean規約名に変更 RN ③ActionFormを継承 RL   CM ②Bean規約名に変更   RN ③ActionFormを継承   RL ④setter/getterを追加   OC ⑤アクションクラスを生成   NE ⑥Actionを継承 ⑦executeメソッドを追加 ⑧メソッド本体を追加   PA モデル変換機能 PA CM NE OC RN RL 操作本体の変更 ○ クラスのマージ クラスの追加/削除 操作の追加/削除 属性の追加/削除 クラス名の変更 操作名の変更 属性名の変更 継承の追加/削除 集約の追加/削除 関連の追加/削除 PA(pointcut & advice),CM(composition),NE(new element),OC(open class),RN(rename),RL(relation)

merge-message-classes AspectMの記述例 MessageクラスとMessageProfileクラスを マージしてPostMessageクラスに変換 << CM >> merge-message-classes message-classes : class { Message || MessageProfile } merge-message-classes [message-classes] : merge-by-name { PostMessage } aspect <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>

6.アスペクト指向の今後

アスペクト指向の今後 歴史は繰り返す... 現在、プログラミング周りで研究が活発(80年代のOOP研究を彷彿させる) 今後は、適用事例の拡大、開発方法論の整備、アスペクトコンポーネント・フレームワークの整備に向かって行くと思われる(90年代のOOソフトウェアエンジアリングの発展に類似) 歴史は繰り返す...

AOSD ソフト開発工程全体への波及 AOP(Aspect-Oriented Programming) から AOSD(Aspect-Oriented Software Development) へ AO: Aspect-Oriented 要求分析 設計 実装 Early Aspect AO Design Pattern AO Language AO Modeling AO Framework AO Component Aspect Mining AO Database

上流段階のアスペクト研究例 Stein他[AOSD2002] Gray他[GPCE2003] Sillito他[ECOOP2004] アスペクトをUML図として表現する方法を提案 モデリング段階のアスペクトはAspectJなどのAOP言語に変換するもので、この方法ではMDAは実現できない AspectMのアスペクトはUML図自身を操作するもの Gray他[GPCE2003] AODM(Aspect-Oriented Domain Modeling)を提案 属性や関連などのモデル要素を追加する機能をもつ MDAなどの一般的なモデル変換を対象にしたものではない Sillito他[ECOOP2004] ユースケースレベルのポイントカットを提案 上流のモデリング段階においてもJPMの考え方が有効であることを示した

アスペクト指向言語の変遷 ドメイン専用AOP言語を個々に開発するアプローチ (1997年頃まで) Weaverを開発するのが大変 汎用AOP言語(AspectJ等: 「Pointcut+Advice」メカニズム)のアプローチ (現在) 適用範囲が限定される 拡張可能ドメイン専用AOP言語の(Xaspect等)アプローチ (これから)

アスペクト指向に関する情報源 ポータルサイト http://aosd.net 国際会議 Aspect-Oriented Software Development (AOSD) OOPSLA, ECOOP, GPCE, ICSE, FSE, ICFP など

おわり