netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2007-01-15 [長年日記] ▲
_ [AspectJ] 誰が処理を行うかを隠蔽するアスペクト ▲
最近,Java で大規模なデータ構造を操作していて,呼び出したいメソッドを持ったオブジェクトへの参照をデータ構造のメンバー全員に行き渡らせるにはどうしたらいいか,などと悩んでいるうちの思いつきです.
メソッド呼び出しには,いつ処理を実行するか(その文をどこに置くか),誰が処理を実行するか(対象となるオブジェクト),どう処理を実行するか(その処理内容)という情報があります.このうち,「どう処理を行うか」については,インタフェースを使って隠蔽することができますが,「いつ,誰が」処理を実行するかというのはそのまま明記されています.
しかし,AspectJ のポイントカット+アドバイスを使うと,元のコードからメソッド呼び出しを取り除くことができます.こうすると,「いつ,誰が」という情報が丸ごと隠蔽されます.AspectJ のポイントカットだと,主に「いつ」実行するかという情報を一箇所にまとめるのが主な役割としているんですが,一方の「誰が」という情報を隠す(呼び出し先への参照の管理をオブジェクトから取り除く)ことも大きな役割ではないのかなーという感覚がしています.
「誰が」だけを隠蔽するアプローチとしては,ASE 2006 のポスター発表で教えてもらった Zhi#の人々の方法があります.この人たちは,あるオブジェクトから employee という関連を逆方向にたどって見つかるオブジェクト(company.employee == this が成り立つ company オブジェクト)を「this.^employee」というような形で参照できるようにしていました(データモデルの情報や,関連の名前についての ontology が与えられているという仮定はありますが).
AspectJ でこれと似たような記述を少ない手間でやろうとするなら,空のオブジェクト参照フィールドを用意しておいて,before(): get アドバイスを使ってそのフィールドを実行コンテキストの値に応じた適切なオブジェクトで埋める,とかいう形になりそうです.これは,Dependency Injection でやってるようなことを,実行時の情報を使って動的にやろうとしている,という気もします.