Microsoft PowerPoint - aop-intro.ppt

Similar documents
アスペクトの相互作用を解消するアスペクトの提案

Microsoft PowerPoint ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

V8.1新規機能紹介記事

今さら人には聞けないAOP入門

PowerPoint Presentation

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

IT プロジェクト

GEC-Java

(Microsoft PowerPoint - Java\221\3461\225\224\211\357\224\255\225\\\227p\216\221\227\ ppt)

PowerPoint プレゼンテーション

AOSD 要求 オブジェクト指向 (OOP) など 本質 アスペクト指向 (AOP) 横断的関心事横断的関心事 2 ウィーバ 結合ルール AOP AOSD 最終的なソフトウェア 1950 FORTRAN OOP 1980 AOP 1 3 Ajax/Web2.0 OOP ( 決定の

JAVA入門

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

ガイダンス

ガイダンス

Java言語 第1回

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

新・明解Java入門


基本情報STEP UP演習Java対策

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

1 Dependency Injection glue glue glue glue glue GluonJ GluonJ glue Dependency Injection Aspect-Oriented Programming Meets Dependency Injection Rei Ish

ガイダンス

プログラミング入門1

PowerPoint プレゼンテーション

JavaプログラミングⅠ

デジタル表現論・第4回

JAVA とテンプレート

Microsoft PowerPoint - prog03.ppt

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

PowerPoint プレゼンテーション

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Java知識テスト問題

PowerPoint プレゼンテーション

有向置換性距離に基づくコンポーネント検索システム

PowerPoint プレゼンテーション

Prog1_6th

プログラミング基礎I(再)

データ構造とアルゴリズム論

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

JavaプログラミングⅠ

Java演習(4) -- 変数と型 --

Exam : 1z0-809 日本語 (JPN) Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO 1 / 8 Get Latest & Valid 1z0-809-JPN Exam's Question and Answe

Microsoft PowerPoint - prog09.ppt

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Microsoft PowerPoint - prog09.ppt

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

JavaプログラミングⅠ

第1章 ビジュアルプログラミング入門

Microsoft PowerPoint - diip ppt

PowerPoint Presentation

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

PPL-summer09chiba

文字列操作と正規表現

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

4-1- 基 Java に関する知識 1 独立行政法人情報処理推進機構

2

JavaプログラミングⅠ

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

JavaプログラミングⅠ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

デザインパターン第一章「生成《

Jude を DSL エディタとして使う -Jude API 活用法 年 11 月 14 日稚内北星学園大学東京サテライト校浅海智晴 本日のテーマ Why Jude API What Jude API How Jude API 1

JavaプログラミングⅠ

Prog1_10th

A B 1: Ex. MPICH-G2 C.f. NXProxy [Tanaka] 2:

Microsoft PowerPoint - chap10_OOP.ppt

オブジェクト指向プログラミング・同演習 5月21日演習課題

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

PowerPoint プレゼンテーション

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Prog1_15th

ガイダンス

S2DaoでもN:Nできます

GEC-Java

Microsoft PowerPoint - prog04.ppt

Java講座

Java言語 第1回

< F2D B838A835882CC8CF68EAE2E6A7464>

GUIプログラムⅣ

r2.dvi

ガイダンス

プログラミング入門1

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Microsoft PowerPoint pptx

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第3版  

JavaプログラミングⅠ

C#の基本

第2回講義

WebOTXマニュアル

rmi.book

リファレンス,配列 例外処理

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

Transcription:

概要 AOP 入門 増原英彦 (masuhara@acm.org) 東京大学大学院総合文化研究科 AOP でやりたいこと AOP でできること 現在の状況 AspectJ の紹介 応用例 他の AOP 言語 SEA フォーラム 2006 年 6 月 1 2 AOP は何をしてくれるか 複数のモジュールにちらばる記述 ( 横断的関心事 ) を一まとめにする : 修正 デバグ レビューを容易にする いつ どこで を明文化する AOP は何をしてくれるか 複数のモジュールにちらばる記述 ( 横断的関心事 ) を一まとめにする : 修正 デバグ レビューを容易にする いつ どこで を明文化する 3 4 1

AOP とは : 具体例 例 : 図形エディタの内部のモジュール化 モジュール : 図形要素 ( 点 線 円等 ) 画面 命令 ( 生成 移動 削除 ) など with OO: モジュール = クラス 効用 拡張 修正 デバグ範囲の限定 ( 例 : 図形要素の追加 ) ポリシーの明文化 アスペクトもモジュール 5 具体例 : 図形エディタ ディスプレイの定義は図形要素の詳細を知らずにできる 図形要素の種類を増やすときの手間が小さい Display ----------- figures ----------- redraw() draw() x, y getx() gety() moveby(dx,dy) setx(x) sety(y) display(disp) FigElm ---------------- moveby(dx,dy) display(disp) Line p1, p2 getp1() getp2() moveby(dx, dy) setp1(p1) setp2(p2) display(disp) 6 問題 : 散らばる記述 aka 横断的関心事 図形変更時に画面を再描画したい 図形を変更している場所は沢山ある モジュールにまとめられない! ほんの一例 x+=dx; y+=dy; this.x = x; this.y=y; Display ----------- FigElm figures this.p1=p1; ---------------- ----------- moveby(dx,dy) redraw() display(disp) draw() this.p2=p2; p1.moveby(dx,dy); Line p2.moveby(dx,dy); x, y p1, p2 getx() getp1() gety() getp2() moveby(dx,dy) moveby(dx, dy) setx(x) setp1(p1) sety(y) setp2(p2) display(disp) display(disp) 7 アスペクトによるモジュール化 図形要素の定義と再描画が独立 DisplayUpdating figurechange() advice() x+=dx; y+=dy; this.x = x; this.y=y; Display ----------- FigElm figures this.p1=p1; ---------------- ----------- moveby(dx,dy) redraw() display(disp) draw() this.p2=p2; p1.moveby(dx,dy); Line p2.moveby(dx,dy); x, y p1, p2 getx() getp1() gety() getp2() moveby(dx,dy) moveby(dx, dy) setx(x) setp1(p1) sety(y) setp2(p2) display(disp) display(disp) 8 2

AOP の現状 : 道具 AOP の現状 : 使われ方 実用的な処理系が揃いつつある AspectJ, AspectC++ AspectWerkz, JBoss AOP, Spring AOP 開発環境もある AJDT plug-in for Eclipse ライブラリはこれから for more: community wiki @ aosd.net AOP@Work (IBM developerworks) 3 種の使われ方 [Kiczales] exploration / enforcement auxiliary / infrastructure core / business 状況 : 実験的使用 ~ 実システムでの部分的使用 商用システムでも (e.g., IBM SWG) 9 10 AspectJ 言語 最も知られている汎用 AOP 言語 他のAOP 言語の手本 Java 言語と上位互換 開発体勢 : Xerox PARCで開発がスタート ( 90 後 ) Eclipse オープンソース開発 ( 現在 ) 開発環境 : Eclipseプラグイン等 バッチコンパイル バイトコード織込 Java ロード時織込 Java 織込と実行 javac Java アスペクト アスペクト javac クラス クラス アスペクト ajc クラス ajc クラス JVM aspectjrt.jar ajc クラス JVM aspectjrt.jar aspectj weaver.jar JVM aspectjrt.jar 11 12 3

AspectJ の主要概念 AspectJ の主要概念 アスペクト (cf. クラス ) 横断的関心事をまとめる単位 アドバイス (cf. メソッド ) 追加的な操作 結合点 ポイントカット どんなとき を決める 型間宣言追加的宣言構造 動作 アスペクト アドバイス ポイントカット 型間宣言 call(void.setx(int)) call(void.sety(int)) call(void Line.setP1()) call(void Line.setP2()); after() : move() { } void.draw(display d) { } 13 14 AspectJ の主要概念 : アドバイス AspectJ の主要概念 : ポイントカット 追加 代替の動作を記述 どんな動作の ( ポイントカット ) 前 / 後 / かわりに ( 修飾子 ) 何をするか ( 本体 ) Java の文 move した後は redraw() を呼べ call(void.setx(int)) call(void.sety(int)) call(void Line.setP1()) call(void Line.setP2()); after() : move() { } void.draw(display d) { } 15 何かが起きたときを指定 動作の種類 ( メソッド呼出 etc.) シグネチャ 合成 call(void.setx(int)) call(void.sety(int)) call(void Line.setP1()) call(void Line.setP2()); after() : move() { } void.draw(display d) { } FigElm.moveby または.setX または を呼出すとき 16 4

AspectJ の主要概念 : 型間宣言 (inter-type declarations) 既存の型に外から宣言を追加 既存の型 クラス インタフェース 追加される宣言 メソッド フィールド extends implements 節 declare parent MyTask: implements Runnable; public void MyTask.run() { init(); } call(void.setx(int)) call(void.sety(int)) call(void Line.setP1()) call(void Line.setP2()); FigElmクラスにdraw メソッドを追加 after() : move() { } void.draw(display d) { } MyTask クラスに Runnable を実装 17 Main setx AspectJ の実行モデル : 結合点モデル 結合点 this.x=x = メソッド呼出 実行 フィールド代入などの実行中の動作 ; after() : move() { } void.draw(display d) { } 18 Main setx AspectJ の実行モデル : 結合点モデル Display Updating 結合点とアドバイスのポイントカットが合致 before の本体 ; 本来の結合点 ; after の本体の順に実行 ; after() : move() { } void.draw(display d) { } 19 Main setx AspectJ の実行モデル : around アドバイス proceed Lock Movement 例 : ロックされた図形の移動を禁止 本来の結合点になりかわって実行 proceed 結合点の実行を再開 aspect LockMovement { ; void around() : move() { if (! locked()) proceed(); } 20 5

ポイントカットの能力 : 横断的な指定 FigElm Line に対する動作をまとめて指定 モジュール化! call(void.setx(int)) call(void.sety(int)) call(void Line.setP1()) call(void Line.setP2()); after() : move() { } ポイントカットの能力 : ワイルドカード + 命令規則 ワイルドカードによって簡潔に定義できる 例 : FigElm とその子クラスにある set で始まる名前のメソッドが呼び出されたとき call(* FigElm+.set*(..)); after() : move() { } 21 22 ポイントカットの能力 : 様々な条件 色々な種類の条件 within(myapp.db..*): DB パッケージ内のみ set(int.x):.x への代入 withincode, execution, get, handler, initialization, static initialization 組み合わせる call(* javax.swing..*(..)) &&!within(myapp.ui..*)): UI パッケージ以外からの Swing 呼出し 23 画面更新の例 各図形に表示画面が対応 アドバイスは 変更される図形 から画面を取得して再描画 ポイントカットの能力 : 文脈情報 (self) の取得 pointcut move(figelm fig) : ( call(void FigElm+.set*(..))) && target(fig); after(figelm fig) : move(fig) { Display d = fig.getdisp(); d.redraw(fig); } 呼出先のオブジェクト : fig 24 6

ポイントカットの能力 : 制御の流れ (cflow) 1 ポイントカットの能力 : 制御の流れ (cflow) 2 p.moveby(2,3); は 3 回 redraw を呼んでしまう setx main sety moveby call(* FigElm+.set*(..)); after() : move() { } class { void moveby(int dx, int dy) { setx(getx()+dx); sety(gety()+dy); } } 呼出スタックを調べられる setx, sety が moveby などから呼出されていないとき setx main sety moveby call(* FigElm+.set*(..)); after() : move() &&!cflowbelow(move()) { } class { void moveby(int dx, int dy) { setx(getx()+dx); sety(gety()+dy); } } 25 26 再利用 : 抽象アスペクト AOP の応用例 抽象アスペクト どこ = 抽象ポイントカットとして定義を遅らせる 動作 = アドバイスに定義する 具体アスペクト ポイントカットを具体化するだけ abstract aspect AbstractLogging { abstract pointcut log(); after() : log() { ログ取り動作... } aspect DBLogging extends AbstractLogging { pointcut log(): call(* myapp.db..*.*(..)); } Architecture enforcement API Scanner @ IBM SWG 例外処理 27 28 7

Architecture Enforcement insurance.ui Architecture Enforcement Modules public aspect ArchitectureEnforcement { insurance.model.listeners insurance.model. insurance.model.validation public pointcut uicall(): (call(* insurance.ui..*(..)) call(insurance.ui..new(..)) &&!call(* java.lang.object.*(..)); insurance.model.impl public pointcut modelcall(): <similar>; persistence insurance.dao insurance.dao.hibernate insurance.dao.inmemory public pointcut modelimplcall() : <similar>;...one per module... 29 30 Architecture Enforcement Modules... public pointcut inui(): within(insurance.ui..*); public pointcut inmodel(): within(insurance.model.*); public pointcut inmodelimpl(): within(insurance.model.impl..*);...one per module... 31... Architecture Enforcement Rules declare warning: uicall() &&!inui(): "No calls into the user interface"; declare warning: modelimplcall() &&!inmodelimpl(): "Please use interfaces in insurance.model instead"; declare warning: daocall() &&!(inmodelimpl() inanydao()): "Only model and DAO implementers should use DAO interface"; プログラマブル 柔軟性が高い 1 つのツールであらゆるアーキテクチャを扱うのは難しい 32 8

Architecture Enforcement At Work Example: API Scanner IBM SWG で利用されているアスペクト群 30 のプロジェクト / 製品で利用 良くない場合を declare warning で検知 1 つのプロジェクト / 製品は他のを使用する環境 例 : public だけど外部 I/F ではないメソッドの呼出 配布しやすいスクリプトにまとめられている 50,000 以上の問題点を発見 設計のモジュール性を尊重すれば自由度が上がる 将来の製品開発の時間短縮の可能性 33 34 insurance.ui insurance.model insurance.dao Example: Exception Management throws throws RuntimeException SIException SIPersistenceException 35 Example: Preliminary Exception Management package insurance.ui; import...; public aspect ExceptionHandling { private static final String title = "Simple Insurance Exception"; Object around() : SystemArchitecture.modelCall() && SystemArchitecture.inUI() &&!within(exceptionhandling) { Object ret = null; try { ret = proceed(); } catch (SIException ex) { MessageDialog.openError(SimpleInsuranceApp.getShell(), title, "Call to "+ thisjoin +" threw exception n n" + ex.getmessage()); } return ret; }} 36 9

AOP はどんな場合に使えるのか? いつそれをやるか が単純でない場合 特定の動作だけログをとる このモジュールだけ例外を別扱い かつ規則化したい場合 将来の拡張 変更のため 力ずくで 100 箇所にコードを書くと後で泣くそうでなければ OO で refactoring すべき 他の AOP 言語 ( 実用に耐えられそうなもののみ ) Java アプリケーションフレームワーク 特徴 : pure Java の記述 ( メタファイル アノテーション ) ライブラリ : 永続化 キャッシュ等 処理系 : AspectWerkz (BEA) AspectJ と共通化 JBoss AOP Spring AOP AspectJ と共通化? Java 以外 : AspectC++ 37 38 まとめ AOPとはモジュール化の手法 使えるところから使われている AspectJの紹介 結合点 ポイントカット アドバイス 型間宣言 応用例 他のAOP 言語 : 共通化が進んでいる 39 10