AOP and Attribute (2)

折角なのでもう少し書いてみます.

面白いのは,今回私が利用した技術の本質は全てEssential .NETの「1.1 COMの再考」という節に集約されていることです.この章で著者は1990年代前半のMicrosoft Transaction Server (MTS)が既に「属性」と「割り込み」にフォーカスした技術であったとしています.著者はまた,MTS が実現した属性の宣言と割り込みをベースとしたモデルがSun Microsystems の Enterprise Java Beans (EJB) でも採用されていることも指摘しています.

今回調べた限りでは分からなかったのが,当時のMTSチームが目指していたのはサーバサイドアプリケーションの実装を容易するためだけの「割り込み」と「属性」にすぎないかどうかということです.しかし後になってそれがAOPであったと分かったとしても,それはMTSチームの業績を何ら貶めるものではないでしょう.
これを書いていて思い出したのが,COMと『デザインパターン』の関係です.いつだったか,『デザインパターン』についての文章で『ファクトリパターン』の説明を読んで真っ先に思い出したのがCoCreateInstanceでした.COMの世界において,CoCreateInstanceはGUIDを引数に取りオブジェクト生成を一手に引き受ける重要なAPIです*1.COMのリリース時期についてはちょうど前回挙げた資料で言及されています.

  • MS オフィスによる第2世代の統合技術として設計される
    • DCEとオブジェクト技術にかなり影響された
  • 93年2Qに16ビット版COMの最初のリリース
    • 1994年Windows NT 3.5での32ビット版COM
  • 1993年12月に最初のDCOMアルファ版が “Jumpstart OLE”CDとして5000部リリース
  • 1996年7月 Windows NT 4.0でDCOMリリース
  • 1997年クロスプラットフォームのリリース

一方,パターン研究の歴史は1970年代後半にまで遡ることができるそうです.

パターンの歴史は,1970年代後半に,C. Alexanderが街や建物を造るときの253のパターンをパタンランゲージとしてまとめたことから始まります.例として,C. Alexanderの横断歩道パターンを紹介しましょう.

また,このページによると『オブジェクト指向における再利用のためのデザインパターン』(asin:4797311126)の刊行は1995年ということです.私が初めてデザインパターンという言葉を聞いたのがいつごろか思い出せなくて,参考までにCマガジンでの記事を検索してみましたが,初出は1996年11月号の『オブジェクト指向な小話』のようです.
http://www.cmagazine.jp/contents/199611.html
確かに当時のCマガジンは読んではいたはずなので目にした可能性はありますが,例え読んでいたとしても恐らく1998年4月の特集号まではその意味に気付かなかったでしょう.
http://www.cmagazine.jp/contents/199804.html
このころになるとデザインパターンの解説本も多数出版されるようになり,また特集記事も多く目にするようになったと記憶しています.そしてCOMよりも先にファクトリパターンという概念を学んだ人から見れば,リフレクションのないC++でGUIDによって型を表現し,それをファクトリメソッドの引数に取るという仕組みは案外新鮮に見えるかもしれません.


さて,COMを知ることでデザインパターン全てを理解できるわけではないように,MTSを知ることでAOPの全てが理解できるわけではありません.が,上で見てきたように現場には現場のおもしろさがあります.まだ世間で知られていない次世代パラダイムの片鱗に触れられるかもしれないことも.そのようなおもしろさの1つだと言えます.そして私にとって現在最も面白い現場の1つが .NET Framework の実装です.kmt-tさんの以下の解釈(id:kmt-t:20040625#p2)は,私の知る限りとても正確な読みだと思います.

ContextBoundObjectって元々はAOPを実現するためにあるんじゃなくて、他に目的がありそうな感じですね。(結果としてAOPになっている感じ)

.NET Framework中でのContextBoundObjectは「分散オブジェクト」や「リモーティングサービス」でも重要な意味を持ち,AOPのためだけのものではありません.この応用性の広さの背後にはより普遍性の高い上位構造の存在を感じます.
また .NET Frameworkの「属性」も多くの応用先があるため紋切り型的な理解の難しい概念の1つです.ここではAOPはその1つの応用先という答えを明かしてしまっていますが,一般的には以下のような説明をされることが多いかと思われます.
http://www.itmedia.co.jp/enterprise/0305/08/epn22_2.html
http://www.unisys.co.jp/club/net_view/20030204.html
http://www.unisys.co.jp/club/net_view/20030212.html
これらの文章でカスタム属性はJavaに対する優位点として紹介されていますが,JavaもJ2SE1.5 (Tiger)でメタデータを導入する*2ようです.
http://www.j-industry.org/jiae/archives/sakuraba.pdf
このように属性という概念が今後主流になっていく可能性は高く,現状のフレームワークのいくつかが将来「属性」によってリライトされることが期待されます.
最後にちょっとだけDirectXの話も混ぜておくと,エフェクトファイルのセマンティクスとアノテーションはまさにカスタム属性の使われ方そのものです.
http://www.microsoft.com/japan/msdn/directx/japan/dx9/hlsl3.asp
http://masafumi.cocolog-nifty.com/masafumis_diary/2004/06/post_7.html
http://masafumi-t.cool.ne.jp/directx9/fxcomposer/fx005.htm
http://www.twin-tail.jp/cgi-bin/programbbs/treebbs.cgi?log=1233

*1:余談ですがAOPの観点から見ればCoCreateInstanceは割り込みポイントとして重要な意味を持ちます.事実MTSはこのクラス生成過程に割り込みを行うことでProxyクラスをユーザプログラムに送り込みます

*2:Javaはあまり詳しくないのですが,現状でもカスタム属性関係のライブラリはあるようです.
http://xdoclet.sourceforge.net/xdoclet/index.html