非常用コードのアスペクト化

今、Aspectといえばロギングであり、それ以外に何がある? 結局AOPは使い物になるの? という疑問をよく耳にする。非常用パッチというのは一つのアスペクトにならないだろうか。

以前、連携しているWEBサービスプロバイダの停止に伴って、Webアプリケーションに一時的な非常対処コードを組み込んだことがあった。そのコードは、サービスプロバイダの復旧とともに削除したのでその自体は問題なかった。通常の保守作業の一環に過ぎなかった。その筈だった。しかし、そのコードが社内でコピペされたために、他のアプリケーション内で思わぬ障害を引き起こし、対処に半日を要した。

この問題は非常用のイレギュラーな動作を加えてあることがより明示的であれば、防げたかもしれないとも思う。AOPの機構をヒューマンエラーの低減のために利用できないだろうか。

もちろん、十分な確認無しにクラスを他のコードツリーからコピーしてくることに問題があったのは確かである。本当にそのクラスの再利用性が高いなら、むやみにコピーしてソースを拡散させずに社内ライブラリ整備の方に廻して集中管理するべきだったし。

しかし、規約無視やその他のヒューマンエラーが無いのであればOOPLのカプセル化機構なんていらないわけで、規約でカプセル化を定義しておけば事足りる。PerlのOOはそうやってる訳だし。「人間はいつでもアホで間抜けなんだから可能な限り言語処理系に押しつけろっ」

ある非常事態に対するイレギュラーな対処やアドホックな対処というのは一つの横断的関心ではないだろうか。すなわち、これをアスペクトとして抽出できるのではないだろうか。たとえばの話、最初の障害例はJavaによるシステムだったのだが、AspectJで.javaファイル外にaspectとして非常用コードを書いてweaveしておいたなら。そうすれば、本来の処理以外に何か「非常用っぽい名前のもの」がweaveされていることは一目瞭然だし、それ以前にjavaソースファイルのみをコピーしても問題は発生しなかった筈だ。

ちなみに、私自身はアスペクト指向を目下勉強中で、先行調査は十分でないのでこのアイディアが言い尽くされたものでないことは保証できない。っていうか、要するにこれって「パッチ」だから、ある意味アスペクトをパッチに喩える類のよくある話の延長上でしかないのかも。悪しからず。

『AspectJによるアスペクト指向プログラミング入門』

『AspectJによるアスペクト指向プログラミング入門』