設定ファイルを書きたいのか、書きたくないのか。

id:higayasuo:20051019#1129707421


ちょうどS2.3の導入検討で色々機能を調べていたところだったので、非常に興味を持って読ませていただきました。
個人的には、設定ファイルに書くのは出来るだけ最小限に抑えたいです。DIコンテナもWebフレームワークもO/Rマッピングツールもそうですが、単に利用する為だけにクラス名を列記したりするのは手間だし、コピペで対応するような記述は極力避けたいというのが本音です。
1.のConfiguration by exceptionは、EJB使ってるときに非常に感じていたことです。「ほとんど同じ設定しか使わないんだから、デフォルト用意してくれ!」と思うようなことが何度もありました。EJB3はそういう批判の反省を元に、様々なデフォルトを標準で用意してるみたいですが。
2.のConvention over Configurationは、S2のインターフェイスの自動バインディング機能等でその威力を実感してます。ある規約を守る(この場合はインターフェイスベースのプログラミングを心掛ける)だけで、開発の容易さという大きな恩恵を受けることが出来る。この考え方は開発者にとって非常にありがたいものだと思います。ただ、全てを規約でコントロールしようとすると、逆に開発が規約に縛られるような状況に陥ってしまうのではないかという懸念もあるので、ある程度の範囲にとどめておくべきだとも思います。例えば、トランザクションアスペクト情報を命名規則によって定義するやり方は好きではありません。「・・・という命名規則に合致するメソッドに対してトランザクションをかける」というやり方では予期しない問題が発生する可能性があるし、オーバーロードしたメソッド全てにトランザクションがかかってしまいます。そうではなくて「このメソッドにはトランザクションをかける」という定義の方が良い、と個人的には思います。
3.Annotation。これは今非常にハマって使ってます。xDocletはどうも好きになれなくてあまり使ってなかったのですが・・・両者の違いは何といっても「コンパイラーがチェックしてくれるかどうか」だと思います。インターフェイスとして情報も持てるから、ソースコード書くのと同じレベルで積極的に利用していくことが出来ますし、リフレクションとの相性もすこぶる良いです。メタデータを広めてくれた.NETに感謝です。

Annotationいっぱいは、XMLファイルに書くよりましですが、好ましくないと思っています。

EJB3のサンプルを見てると、ときどきアノテーションに埋もれたようなクラスを見かけることがあります(苦笑)何事もさじ加減が大切で、アノテーションが「メタ情報」であるという基本を忘れないようにして使うことが重要なのかな? と思ってます。例えば、自分はアスペクトの指定をアノテーションを利用して定義する方法が好きなのですが、同じアスペクトでも、トランザクションのような「クラスの受け持つ役割に密接に絡んでくる」機能は、アノテーションによってクラスにその所在を明らかにしておいた方がわかりやすいと思います。「このメソッドを実行したらRequiredトランザクションが実行されます」という情報を知ることが出来るのは、ソースを読むときに非常に有効だと思いますし。しかし、例えばトレースのような機能は、別にクラス本来の役割とは関係ないことが多いし明記しておく必要も感じないことが多いので、クラスのパターン指定で一括に定義した方がいいかなと思います。「ここでログを出しますよ」という情報は、別にクラスに無くてもいいと思うので。同じ考えで、コンポーネントバインディング情報をクラスに書くのもあまり好きではありません。「"hoge"という名前で定義したコンポーネントをこのフィールドにセットしますよ」というメタ情報がクラスにあることに対して、それ程有効性を感じないし・・・ここらへんは、人によって考え方が違ってくるかもしれませんが。
こんな風に「このメタ情報はクラスに置くべきか、ファイルで一括定義すべきか」と切り分けて考えていくことが重要だと考えてます。