クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化

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

ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
アスペクト指向プログラミングに 関する十の神話
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングと Dependency Injection の融合
プログラミング演習3 第2回 GUIの復習.
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
契約に基づいたアスペクト指向リファクタリングの検証
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
アスペクト指向の 分散化支援ツール 西澤無我、千葉滋 東京工業大学 SPA summer 2002, Hakone.
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
プログラミング演習3 第2回 GUIの復習.
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
活性化のタイミング制御の実装を分離記述可能な分散動的アスペクト指向言語
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
Java における 先進的リフレクション技術
契約による クラスとアスペクト間の 影響解析
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
様々なAOPメカニズムをモデル化する パラメータ化インタプリタ
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
ロールを基にした構造進化の表現 Role based Evolution Dependency Structure Matrix
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化 堀江 倫大  千葉 滋 東京工業大学

モジュラープログラミング 全体をモジュールに分割 モジュール(=クラス)の (インタフェースの)仕様を決める 仕様だけを見てプログラミング モジュール(=クラス)の (インタフェースの)仕様を決める 仕様だけを見てプログラミング クラスの仕様: シグネチャ + メソッドの振る舞い 情報隠蔽 内部実装は見なくてすむ

Java の場合 クラスの仕様と実装を一緒に考える 例) javadoc コメント メソッドの仕様 (javadoc コメント) class Line extends Shape { :  /**   * moves this shape dx along the x axis   * and dy along the y axis.   */  public vod moveBy(int dx, int dy) {   p1.setX(p1.getX() + dx);   p1.setY(p1.getY() + dy);   p2.setX(p2.getX() + dx);   p2.setY(p2.getY() + dy);  } } メソッドの仕様 (javadoc コメント) メソッドの実装

AspectJ の場合 例:図形エディタへの機能追加 事前条件を追加するアスペクトを定義 Point クラスの setX、setY メソッドの振る舞いを変更 図形エディタのウィンドウ サイズ (0 < x < 100、 0 < y < 50) 内に図 形は描画されなければならない 50 100 × aspect Contract { before(int x) : call(void Point.setX(int)) && args(x) && within(Shape+) { if (x < 0 || 100 < x) throw new IllegalArgumentException(); } before(int y) : call(void Point.setY(int)) && args(y) && within(Shape+) { if (y < 0 || 50 < y) throw new IllegalArgumentException(); }}

アスペクト指向(AOP)に対する批判 モジュラープログラミングが不十分 仕様だけを見てプログラミングできない class Line extends Shape { : /** * x 軸方向に dx、y 軸方向に dy だけ * 直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); p1.setY(p1.getY() + dy); p2.setX(p2.getX() + dx); p2.setY(p2.getY() + dy); }} 正しくなくなる aspect Contract { : if (x < 0 || 100 < x) throw new IllegalArgumentException(); }

仕様の間の依存関係 アスペクトによって呼び出しの上流・下流の仕様も変わる class MultiLines { private List lines; : /** * x 軸方向に dx、y 軸方向に dy * だけ多重線を平行移動させる */ void moveBy(int dx, int dy) { for (Iterator it = lines.iterator(); it.hasNext();) ((Line) it).moveBy(dx, dy); }}  class Line { : /** * x 軸方向に dx、y 軸方向に dy * だけ直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); }} class Point { private int x, y; : /** x 座標の値を設定 */ void setX(int nx) { x = nx; }} aspect Contract { …. }

開発ツール:AspectScope アスペクト 実装の変更 pointcut-advice 仕様の変更 アドバイスのコメント 仕様の変更  アドバイスのコメント class Line extends Shape { : /** *  x 軸方向に dx、y 軸方向に dy だけ * 直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); p1.setY(p1.getY() + dy); p2.setX(p2.getX() + dx); p2.setY(p2.getY() + dy); }} aspect Contract { /** * 直線の両端の x 座標は 0 以上 100 以下 * に制限される */ before(int x) : … { if (x < 0 || 100 < x) throw new IllegalArgumentException(); } : }} Weave Weave

変更後の仕様はツールが表示 Eclipse プラグインとして開発

織り込まれた仕様の表示 AspectScope のテキストエディタ マーカー: 仕様が変わっている箇所 javadoc コメント: 変更後のメソッドの振る舞い アスペクトが追加したコメント

アスペクト中の仕様の変更点の記述 comment アノテーション アドバイスのコメント 織り込み先ごとに別々のコメントを用意 * The set value x should be no fewer than 0, nor more than 100 *   only if the caller is the subclasses of Shape * * @comment (execution(void Line.moveBy(int, int))) * The horizontal position of both the starting point and the end * point should be no fewer than 0, nor more than 100 * @comment (execution(void MultiLines.moveBy(int, int))) * The horizontal position of this line should be no fewer than 0, * nor more than 100 */ before(int x) : call(void Point.setX(int)) && args(x) && within(Shape+) { … }

呼び出しの上流・下流にも織り込み メソッドごとに異なるコメントを織り込む class MultiLines { private List lines; : /** * x 軸方向に dx、y 軸方向に dy * だけ多重線を平行移動させる * 多重線の x 座標は 0 以上 100 * 以下の範囲内に制限される */ void moveBy(int dx, int dy) { for (Iterator it = lines.iterator(); it.hasNext();) ((Line) it).moveBy(dx, dy); }}  class Line { : /** * x 軸方向に dx、y 軸方向に dy * だけ直線を平行移動させる * 直線の両端の x 座標は * 0<x<100 に制限される */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); }} class Point { private int x, y; : /** x 座標の値を設定  * Shape のサブクラ   * スから呼ばれたとき * だけ 0<x<100 に *  制限される */ void setX(int nx) { x = nx; }} aspect Contract { /** @comment… */ }

コメントの織り込み先の指定 織り込み先の条件指定 条件なし execution( method pattern ) 特定のメソッド within( class pattern ) 特定のクラス内、パッケージ内のメソッド (例) within(* csg.figures.*) caller( int ) n 段前の呼び出し階層 同様の処理を行うメソッド Line moveBy csg.figures Point Line Arrow Rectangle … Rectangle moveBy Point setX Triangle moveBy Contract

outline ビュー クラスの中で定義されたメソッドとフィールドの列挙 ソースコードを見る必要はない アスペクトによって変更されていたらアイコン(  )を表示する ソースコードを見る必要はない UndoCmdAspect によって拡張

実アプリケーションでの調査 目的 対象アプリケーション アスペクトの織り込みにより、仕様が変わっているか 織り込み先ごとに異なるコメントを必要としているか 対象アプリケーション Web アプリケーション Health Watcher (HW) [A. Rashid ら ‘07] クラス数 692 (LOC: 9,591)、アスペクト数 25 (LOC: 1,989) アスペクトの使用方法は5通り デザインパターン、例外処理、永続化、トランザクション、ロギング

AspectScope の適用結果 記述したコメントの種類と追加された箇所の数 Observer パターンにおける追加コメントの例 必要性が確認された 記述したコメントの種類と追加された箇所の数 Observer パターンにおける追加コメントの例 setPassword: “Calls <code>updateObserver</code> after setting the new password of the employee to update the Observer.” executeCommand: “Updates the information of the employees by calling <code>updateObserver</code>.” パターン 拡張したメソッド数 呼ばれる側 呼び出し1階層上 呼び出し 2階層上 3階層上 6階層上 9階層上 Observer Command Factory State  17 3 15 17 NA 14   0 13 10 5 2 まとめを言う。

関連研究: Aspect-Aware Interface (AAI) AAIの概念を提案した論文 [G. Kiczales ら ‘05] 「AOP には OOP とは異なる新しいインターフェース AAI が存在する 」 AspectScope は AAI を具現化したツール 変更後の仕様の表現を工夫 コメントとして書く ツールで変更後のコメントを見る AAIは上流・下流への影響を考慮していない

関連研究: Open Module AOP の能力を制限して、モジュラープログラミングを可能にしている クラス側からは、どこが拡張されるかが分かる Open Module に公開されたポイントカットしか、アスペクトは拡張できない 将来の機能拡張に備えて ポイントカットを予め公開して おくのは難しい AOP の利点を損なう module FigureModule { class Line; expose call(void Point.setX(int)) || call(void Point.setY(int)); }

まとめ: AspectScope はモジュラーな AOPを支援 ツールが変更された仕様を表示 元の実装の javadoc + アスペクトが追加した javadoc エディタのマーカー、アウトラインビューによる更新点の通知 Eclipse プラグインとして開発 M. Horie, S. Chiba. “AspectScope: An OutlineView for AspectJ Programs”, Journal of Object Technology