«前の日記(2003-09-29) 最新 次の日記(2003-10-01)» 編集

netail.net

自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.

最近のお知らせ (古いものはこちら)


2003-09-30 古い日記からの変換データ [長年日記]

_ 論文

Hanenberg, S., Oberschulte, C., Unland, R.: Refactoring of Aspect-Oriented Software, Net.ObjectDays 2003, Erfurt, Germany, September 22-25, 2003

Aspect-aware Refactorings をしましょう,という論文.

call(class_name.set(*)) でアスペクトを貼り付けても,「メソッドの引き上げ」などのリファクタリングをしてしまうとアスペクトが効果を発揮しなくなってしまう.

メソッドの名前変更 (Rename Method):

C.foo から C.bar に変更した場合,pointcut も変更する必要がある.call(*.foo()) → call(*.foo()) || call(C.bar()); とか,call(*.bar()) → call(*.bar()) && !call(C.bar()); とか.

メソッドの抽出:

C.foo の一部を C.bar に抽出した場合,withincode を等価変換するには,次のように変更する必要がある.withincode(void *.foo(..)) → (withincode(void *.foo(..)) && !call(void C.bar(..))) ||(withincode(void C.bar(..)) && !execution(void C.bar(..)) && cflow(withincode(void C.foo(..))));

メソッドの移動:

C.foo から D.foo に移動した場合,target や this を変更する必要がある.pointcut x(C c): execution(void *.foo()) && this(c) → pointcut new_x(C c): execution(void *.foo()) && this(c);pointcut new_y(D d): execution(void D.foo()) && this(d);

アドバイスの抽出(Extract Advice):

this, target, args, などを使って元のメソッドを厳密に指定する.また,advice 自体は around を使って,メソッドの実装をコピーして,元のメソッドに残した部分だけをproceed に変えて,なるべく元の制御構造を維持するようにすると簡単.

Introduction の抽出(Extract Introduction):

こっちは,普通にメソッド定義をコピーし,頭に型名をつけるだけでよい.

Pointcut の分解 (Separate Pointcut):

pointcut 定義の共通部分だけをくくりだして別の pointcut にする.

で,この人たちは,Aspect-aware なリファクタリングをするためのツールを Eclipse プラグインとして作ったらしい.

主に名前と型情報関係だけで,cflow などは(実際に呼ばれるコンテキストが変わらない限り)影響を受けないので気にしなくてよいらしい.

_ 論文

Pascal Costanza:Dynamically Scoped Functions as the Essence of AOP

を読んでみた.Lexical Scope (定義位置に依存して変数の binding が決まる)と Dynamic Scope (実行時点に依存して変数の binding が決まる)の違いをCommon Lisp 的記述を使って説明している.

で,アスペクトの役割をdflet という述語を使ってdflet (関数などの再定義) (評価したい関数)という形で書いている.「評価したい関数」というのが変換元のプログラムのことで,「関数などの再定義」 がアドバイスに相当し,「評価したい関数」の中で呼んでいる関数を実行時バインディングで置き換える.

「関数などの再定義」をする dflet をどこに配置するかというのが,Pointcut の役割をしている.

「特定のポイントで関数のバインディングを変える」とみなすか「イベントに連動してまったく処理を行う」と考えるか,という違いのような気がするけれど,関数のバインディングと制限してるほうがちょっと範囲が狭くて,それで十分な範囲をカバーしているのか謎.

_ 論文

aosd-discuss で,次の記事のことが話題に上がっていた.

Pascal Costanza:Dynamically Scoped Functions as the Essence of AOPACM SIGPLAN Notices,Volume 38 , Issue 8, pp.29-36 (August 2003)http://portal.acm.org/citation.cfm?doid=944579.944587

この記事に対して,Kiczales が,「cflow を dynamically scoped functionとしてとらえるにしても,AOP はそれだけじゃないでしょ,たとえばメソッド呼び出し以外の join points だってあるんだから,云々」と言ってた.ということで,後で読んでみることにする.

お名前:
E-mail:
右の画像に書かれている文字列を入力してください:
コメント: