アノテーションの概念的な位置付けとDIとの関係

年末にこんなことを書いてました。

手続き・性質・所属という、考えるべき3つの側面があるのに、オブジェクト指向言語としては、性質と手続きか、所属と手続きの表現手段しか与えられていないため、残りのひとつを使える2つに分担させることで無理が出てたのです。 解決策として、手続きはどの言語にしてもメソッドとして実現されていて、性質はクラスで表現することが適しているので、所属を表現する手段が用意できればいいということになります。 ここで、所属としては、オブジェクトの位置付けとオブジェクト同士の関連が考えられます。 そこで、オブジェクトの位置付けをJ2SE5のメタデータやXDocletのタグで記述し、オブジェクト同士の関連をDIコンテナのビーン定義ファイルに記述するというのが、ひとつの解決策として期待されているのではないかと考えています。

ここだけ見るとかなりわけわからない文章ではありますが。通してみてもわけわからないですけどね。


性質の情報はクラスとして定義できるけど、そのインスタンスがどこに所属するかという情報はクラスだけでは定義できないので、アノテーションを使うということなのですが、要するにコンテナによってオブジェクトを生成するための静的な情報をアノテーションで記述するというわけです。
オブジェクトの静的な情報、つまり、実行時じゃなくてプログラム記述時に決まるオブジェクトの情報を、コンストラクタやメソッドの中で手続きとして記述するのではなくて、アノテーションとして静的に記述することでコンストラクタやメソッドは手続きの記述に専念できるわけです。


DIコンテナに関しても、オブジェクトの静的な関連を表現するのがDIコンテナの役目だと思っています。そのための手段がインジェクションで、その結果テストが容易になったりOCPが実現できたりするわけです。
そう考えると、両方オブジェクトの静的な情報を扱うわけなので、DIの定義をアノテーションで書くとかなりハマるはずです。ぼくはXDocletを使ってSpring開発をしてて、インジェクションされたオブジェクトを使う側に関しては全く定義ファイルを意識せずにかけていますが、インジェクションするオブジェクト側に関しては現状手書きです。これがアノテーションになれば、インジェクションするオブジェクト側もアノテーションで記述できるようになります。


Springの定義継承をうまく使うと、オブジェクトがどのグループに属するかという表現にもなります。例えば納品を扱う画面オブジェクト群・請求を扱う画面オブジェクト群がそれぞれ納品画面共通定義・製品画面共通定義を継承することになったりしますから。より静的保証するためにはインターフェイスとの併用が効きますね。
C++だと多重継承できるのでクラス継承だけで表せるんですが、インターフェイスだと中身がなくてあまりおいしくなかったことが、DIでの定義継承と組み合わせることでおいしくなってきます。


部品の性質を決めるのがクラスの継承関係で、部品の配置や接続を決めるのがDIです。その配置や接続の情報を記述するのがアノテーションということになります。
その結果、コンストラクタやメソッドの中には手続きだけを記述できるようになって、プログラムがすっきりするのでいろいろメリットがあるわけですね。

次の小ネタ

やっぱDigesterというのは地味だったようで、反響はあまりない。
で、まぁ、POJO Strutsは作るとして、ほかのやつ。
JavaCCにJava5構文がついてるということなので、Javaでヒアドキュメントを書けるようにするプリプロセッサを作ってみるとか。Velocity使うときに便利。
誰も使いそうにないところがステキす。自分でも使わない。
JavaCCネタとして、SQL解析してそれっぽいオブジェクトにマッピングしてくれるツールとか。作って何に使うんだろう?
Javassistアノテーションが扱えるようにしてみるとか。使うことあるのかな?
というか、いっそう地味。


くだらないこと考えてないで仕事しなさい。__ノフ○