契約に基づいたアスペクト指向リファクタリングの検証

Slides:



Advertisements
Similar presentations
関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Javaのための暗黙的に型定義される構造体
Dynamic AOPと その実装手法について
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
SSR 産学戦略的研究フォーラム 平成26年度調査研究グループ 「大規模複雑な自己適応システムの 適応進化制御手法に関する調査研究」 研究成果 田原 康之 電気通信大学 2015/3/31.
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
{t-isio, kamiya, kusumoto,
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
プログラミング言語入門.
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
活性化のタイミング制御の実装を分離記述可能な分散動的アスペクト指向言語
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
契約による クラスとアスペクト間の 影響解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
拡張可能なアスペクト指向モデリングにおける織り合わせの検証
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
ソフトウェア工学 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
様々なAOPメカニズムをモデル化する パラメータ化インタプリタ
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
開発者との対話を活かした 横断的構造の表現
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

契約に基づいたアスペクト指向リファクタリングの検証 九州工業大学大学院 情報工学研究科   朴 金姫,篠塚 卓,鵜林 尚靖

発表の流れ 背景 アスペクト指向プログラミング(AOP) AOリファクタリング 契約による検証 評価 関連研究 まとめ

アスペクト指向プログラミング(AOP) AOリファクタリング 背景  アスペクト指向プログラミング(AOP)  AOリファクタリング

アスペクト指向プログラミング(AOP) AOPは横断的関心事を分離し,アスペクトとしてモジュール化する技術である 横断的関心事:様々なクラスに散在している関心事 アスペクト:横断的関心事をモジュール化する単位 ウィーバーによってシステム本来の機能に織り込まれる AspectJ:代表的なAOP言語 アプリケーション機能実装 アプリケーション機能 アスペクト ウィーバー アスペクト

横断的関心事 ログ処理の例 赤い線はログ処理を行うコード 複数の場所に分散している AOP AspectJ. http://eclipse.org/aspectj/

横断的関心事 AOP 実際の振る舞い クラス ・・・・・・ アスペクト ・・・・・・ methoda methoda Advice1 織り込み method1 methodb method2 Advice2 methodc methodb method2 methodc ・・・・・・ method1 ・・・・・・

AspectJ アスペクト : AspectJ中のモジュール単位の一つ AOP AspectJ アスペクト : AspectJ中のモジュール単位の一つ ジョインポイント : プログラムが実行する時に割り込ませるコードの位 置 メソッドの呼び出し先 ポイントカット : 織り込み先のジョインポイントを選択する記述 プリミティブポイントカット:call , execution etc. ポイントカット中のジョインポイントは &&, ||, ! などの論理記号で組み合わせる アドバイス : 指定するポイントカットによって選択されるジョイン ポイントに差しかかったときに実行されるコード 実行するタイミングによってbefore,after, around などがある ウィーバー : クラスとアスペクトを織り合わせる処理系

AspectJの例 AOP class Queue { void enqueue (Object element) {…}  Object dequeue () {…}  boolean empty () {…}  int size () {…}   ......  void display () {    Iterator i = elements.iterator ();     ......   } } aspect Debugging{   ......   pointcut queueModified(Queue q):     (execution(void Queue.enqueue(Object))||execution(Object Queue.dequeue())) && target(q);   after (Queue q) : queueModified(q){ q.display(); } }

リファクタリング リファクタリング AOリファクタリング プログラムの外部的振る舞いを変えず,内部構造を改善する手法である リファクタリングを行った後,プログラムコードの理解や修正が簡単になる AOリファクタリング アスペクト指向におけるリファクタリング

AOリファクタリングカタログ Catalog of Aspect-Oriented Refactorings --Monteiro, M. P. ①横断的関心事を抽出するためのリファクタリング ②アスペクト内部を再構造化するためのリファクタリング ③一般化を行うためのリファクタリング

例に関するリファクタリングパターン リファクタリングパターン名: 典型的な状況: 推奨動作 AOリファクタリング 例に関するリファクタリングパターン リファクタリングパターン名: Move Method from Class to Inter-type 典型的な状況: あるメソッドが含まれている関心事はクラスの関心事ではない 推奨動作 そのメソッドをアスペクトへインタータイプとして移動する

例におけるリファクタリング Move Method from Class to Inter-type AOリファクタリング class Queue {  void enqueue (Object element) {…}  Object dequeue () {…}  boolean empty () {…}  int size () {…}   ...... } aspect Debugging{ class Queue {  void enqueue (Object element) {…}  Object dequeue () {…}  boolean empty () {…}  int size () {…}   ...... void display () {    Iterator i = elements.iterator ();     ...... } Queue.display (){ ...... } } aspect Debugging{ ......

リファクタリングで発生する問題 Move Method from Class to Inter-type AOリファクタリング class Queue {  void enqueue (Object element) {…}  Object dequeue () {…}  boolean empty () {…}  int size () {…}   ...... } aspect Debugging{ class Queue {  void enqueue (Object element) {…}  Object dequeue () {…}  boolean empty () {…}  int size () {…}   ...... void display () {    Iterator i = elements.iterator ();     ...... } void display () {    Iterator i = elements.iterator ();     ...... } ...... } } aspect Debugging{ ...... void display () {    Iterator i = elements.iterator ();     ...... }

解決方法 契約:静的な構造に関する性質を表現する リファクタリングを行った後プログラムの構造は変わるが振る舞いが変わってはいけない AOリファクタリング 解決方法 リファクタリングを行った後プログラムの構造は変わるが振る舞いが変わってはいけない リファクタリングを行う最中に発生する問題は発見しにくい リファクタリングの正しさを検証する ①振る舞いが正しく保存される ②構造が正しく変換される 契約:静的な構造に関する性質を表現する

契約による検証

契約 リファクタリングを行う前後で満たされるべきプログラムの構造的性質を事前条件,事後条件として与える.これらの条件をまとめて,契約と呼ぶ. 契約による検証 契約 リファクタリングを行う前後で満たされるべきプログラムの構造的性質を事前条件,事後条件として与える.これらの条件をまとめて,契約と呼ぶ. 事前条件:リファクタリングを行う前,プログラムの性質 事後条件:リファクタリングを行った後,プログラムの性質 COW(COntract Writing language)言語で記述する プログラムの静的な構造や振る舞いを一階述語論理で記述する

COWの基本述語① 構造的特徴を表す述語 契約による検証 class(c) クラス interface(i) i はインターフェース extends(x, y) 継承関係を表す implements(x, y) 実装関係を表す constructor(a) コンストラクタ method(a) メソッド field(v) フィールド enumerator(v) 列挙子 parameter(v) フォーマルパラメータ variable(v) アクチュエータの局所変数 name(x, n) 名前を表現する body(a, b) アクチュエータ のボディトークン列 abstract(x) 修飾子 abstract によって修飾される owner(x, t) 所有関係 aspect(a) アスペクト pointcut(p) ポイントカット beforeAdvice(a) before アドバイス afterAdvice(a) after アドバイス aroundAdvice(a) around アドバイス intertypeOwner(x, c) 織り込みによる所有関係 target(a) 制約条件の適用先アクチュエータ source(a) 織り込まれるアドバイス

COWの基本述語② 動的特徴を表す述語 その他 契約による検証 entry(a, s) a の実行開始位置はステートメント s call(s, a) s はアクチュエータ a を呼び出す return(s) ステートメント s は復帰文 write(s, v) ステートメント s はシンボルv に書き込む read(s, v) ステートメント s はシンボルv を参照する defuse(s, dv, sv) ステートメント s で,シンボル dv への書き込みがシンボル sv を用いて行われる controlFlow(a, g, s) a 以下の制御フロー上で,ステートメント g はステートメントs から到達可能 dataFlow(a, d, dv, s, sv) a 以下のデータフロー上で,ステートメント d 内のシンボル dv は,ステートメント s 内のシンボル sv から到達可能 equal(x, y) x と y が等しい true 真 false 偽

契約テンプレート 本研究は,典型的なリファクタリングパターンに対して,契約をテンプレートという形で提供する 契約による検証 契約テンプレート 本研究は,典型的なリファクタリングパターンに対して,契約をテンプレートという形で提供する AOリファクタリングカタログの各パターンに対して,リファクタリングの前後で成立すべきプログラムの構造的性質を契約としてまとめる COW言語で記述する

例に対する契約テンプレート Move Method from Class to Inter-type 契約による検証 事前条件 2. メソッド<M>は,アスペクト<A>に定義されていない 事後条件 1. メソッド<M>は,クラス<C>に定義されていない 2. メソッド<M>は,クラス<C>へインタータイプ宣言によって追加定義される 3. メソッド<M>は,アスペクト<A>に定義されている class(type: <C>) && owner(actuator: void <C>.<M>, type: <C>) aspect(type: <A>) && !owner(actuator: void <C>.<M>, type: <A>) class(type: <C>) && !owner(actuator: void <C>.<M>, type: <C>) class(type: <C>) && intertypeOwner(actuator: void <C>.<M>, type: <C>) aspect(type: <A>) && owner(actuator: void <C>.<M>, type: <A>)

例に対する契約テンプレート 事前条件 事後条件 契約による検証 Move Method form Class to Inter-type contract { requires (     class(type: <C>) && owner(actuator: void <C>.<M>, type: <C>) &&     aspect(type: <A>) && !owner(actuator: void <C>.<M>, type: <A>)   ); } ensures (     class(type: <C>) && !owner(actuator: void <C>.<M>, type: <C>) && intertypeOwner(actuator: void <C>.<M>, type: <C>) && aspect(type: <A>) && owner(actuator: void <C>.<M>, type: <A>) 事前条件 条件1 条件2 事後条件 条件1 条件2 条件3

契約による検証 リファクタリングを行う目的にあわせて,カタログから対応するリファクタリングパターンを選択する リファクタリングパターンの契約テンプレートを参照し,<C>,<A>,<M>などのパラメータを実際のプログラムのクラス名、アスペクト名,メソッド名で書き換えて,プログラムに対応する契約を作成する 契約の事前条件とリファクタリング前のプログラムをペアとし,事後条件とリファクタリング後のプログラムをペアとして,それぞれ検証を行う COW言語はツール化されている.契約と検証対象のプログラムあれば,検証処理は自動化にできる.

例に対応する契約 契約による検証 contract { requires( class(type: Queue) &&     owner(actuator: void Queue. display (), type: Queue) &&     aspect(type: Debugging) &&     !owner(actuator: void Queue. display (), type: Debugging)   ); } contract {   ensures(     class(type: Queue) && !owner(actuator: void Queue. display (), type: Queue) && intertypeOwner(actuator: void Queue. display (), type: Queue) && aspect(type: Debugging) && owner(actuator: void Queue. display (), type: Debugging)   ); }

評価

評価 AOリファクタリングカタログの内,78%パターンが契約テンプレートを用いて検証することができる 契約テンプレートは,簡単に利用できる ① Change Abstract Class to Interface ◎ Extract Feature into Aspect ○ Extract Fragment into Advice Extract Inner Class to Standalone Inline Class within Aspect Inline Interface within Aspect Move Field from Class to Inter-type Move Method from Class to Inter-type Replace Implements with Declare Parents Split Abstract Class into Aspect and Interface ② Extend Marker Interface with Signature Generalize Target Type with Marker Interface Introduce Aspect Protection Replace Inter-type Field with Aspect Map Replace Inter-type Method with Aspect Method Tidy Up Internal Aspect Structure ③ Extract Superaspect Pull Up Advice Pull Up Declare Parents Pull Up Inter-type Declaration Pull Up Marker Interface Pull Up Pointcut Push Down Advice Push Down Declare Parents Push Down Inter-type Declaration Push Down Marker Interface Push Down Pointcut 評価 AOリファクタリングカタログの内,78%パターンが契約テンプレートを用いて検証することができる ◎ :契約テンプレートを用意したパターン ○ :いくつか“◎”パターンを組み合わせて検証できるパターン 記号なし: 契約テンプレートを用意していないパターン 動的特徴を記述することができる 契約テンプレートは,簡単に利用できる 記号なし,

関連研究

関連研究 Refactoring object-oriented frameworks - W. F. Opdyke オブジェクト指向リファクタリングの正しさを一階述語論理を用いて検証する方法を提案している 事前条件の概念を導入し,構造に関する26個の基本変換,3つの複合変換でリファクタリングを表現する Refactoring: Improving the Design of Existing Code - M. Fowler 複雑なリファクタリングをいくつか小さいリファクタリングに分けて検証する方法を提案している 検証の順番とタイミングを決めるのが難しい Deriving Refactorings for AspectJ - Leonardo Cole アスペクト指向リファクタリングを”laws”と呼ばれる変換規則を合成して行う方法を提案している

まとめ

まとめ 本研究は,AOリファクタリングの正しさを契約に基づいて検証する手法を提案した 各テンプレートは,実際にリファクタリングの検証のために利用できることをテストし,有効であることを示した 今後は,契約テンプレートをサポートする検証ツールを開発し,検証を自動化して行く必要がある

終わり