t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

アスペクト指向について調べた結果、VBAではどうにもならないことが判明

まぁ、VBAでどうにもならないってのは当然予想していた結果だが、たまに見かけるアスペクト指向とは何なのかが少し理解できたので紹介する。

簡単に言うと、オブジェクト指向の弱点を克服すべく生まれた新しい手法である。
(新しいとは言っても登場してからすでに10年は経っているが)

アスペクト指向について調べたきっかけは、先日書いたVBAで引数付きのコンストラクタである。

オブジェクトが初期化されていない状態でメソッドが呼ばれるとバグの元になるので、エラー処理としてReadyCheckを各メソッドに書いた。

でもこれって、ほぼすべてのメソッドに書かないといけない。
問題は手間がかかることではなく、そのコードが美しくないということである。
一般的にプログラマーは同じコードの繰り返しを嫌う。

アスペクト指向では、そのような複数のメソッドにまたがる処理を、横断的関心事と呼ぶらしい。
どうも、アスペクト指向ではその横断的関心事をエレガントに解決できそうだというところまでは分かった。
つまり、アスペクト指向を使うとすべてのメソッドに書いていたReadyCheck処理を一カ所にまとめることができるということ。これは大変魅力的である。

しかし残念なのは、VBAではどうしようもないということ。
普通のJavaでも出来ないようで、AspectJというJavaを拡張した言語が必要。
まぁ、VBAはそれ以前に残念な点(オブジェクトを継承できないとか)が色々あるので、今更言っても仕方ない。
(そもそもReadyCheckってコンストラクタに引数を渡せないから必要になったのであって、VBAアスペクト指向を実装する前にコンストラクタの仕様をなんとかする方が先だ。)

ちなみにアスペクト指向Wikipediaで調べると「オブジェクト指向とは直交する概念である。」などと意味不明な説明が。。
直交ってのは何だろうかと検索してみると、垂直に交わることを意味しており、正反対(180°)の概念ではないが、全く異なる概念(90°)ということらしい。

参考:「直交する」 - 岩本隆史の日記帳

普通に、全く異なる概念であると書くと併用できないと誤解されかねないからだろうか。

以下にわかりやすい説明があったので紹介する。

アスペクト指向オブジェクト指向の限界を補完しようとするものである。決してオブジェクト指向を置き換えるものではない。ちょうど手続きや関数による抽象化では不十分な点をオブジェクト指向が補っているように、オブジェクト指向では不十分な点をアスペクト指向は補おうとしている。オブジェクト指向が普及しても、手続きや関数が依然として基礎であるように、アスペクト指向にとってもオブジェクト指向は基礎である。

参考:http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/notes/aop03/

これを読んで私もアスペクト指向を勉強したいと思ったが、まずは今やっているデザインパターンを済ませないといけない。まだまだ先は長いなーと思った。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。