SpringとS2

ひがさんの日記「AOP比較」を見て思わず反応してしまいます.といっても,AOPの比較というよりもうちょっと全般的なイメージについてだけです.なんせ,SpringのAOPまだまだ学習中なものですから.
Springってミニマリズムですよね.プログラミング言語に例えると,LispSmalltalk風.根源的かつ最小限のアイディアの上に全てを構築するようなアプローチ.Lispは関数,Smalltalkはオブジェクトへのメッセージパッシングがその根源的なアイディアで,ともにif文のような制御構造さえも言語レベルでは持っていない位,徹底してミニマルです.ミニマリズムな言語って,概念の美しさは分かるものの,とっつきにくいところがありますよね.関数の山に埋もれたり,オブジェクトの海におぼれたりして,どこからどう手をつけていいのか分からない感じ.
SpringはまさにそれのIoCコンテナ版で,すべてはJavaBeans.AOPもコンテナが直接サポートしているわけではありません.Beanを定義するXMLファイルでも,DTD的にはAspectに対応する要素や属性は一切ありません.全ては他のBeanと同じようにコンテナに組み込まれた,(たまたま)AOPを実現してくれるBeanによって実現されているわけです.まるでCommon Lisp上に構築されたCLOSのよう? 潔いとは思いますし,もっと強力なAOPの実装が出てきたときでも容易に対応できたりハイブリッドに使い分けたりと,自由度は高いのでしょう.でもね,面倒なんですよ,ものすごーーーく.
一方のS2ではAspectもファーストクラスのオブジェクトっていうやつですね.コンテナが直接理解してくれます.そのせいかとても直感的で,まさに易しくてかつ優しいという感じ.まさたかさんの日記にあるチュートリアルを見ても,設定ファイルの記述が本当に簡単で分かりやすいです.Springと違って,余計なものがまったく出てこない.AOP以外でも,プロパティの自動セットやSelなどもとても強力なようで,理屈っぽい一貫性より人間の直感に一致することを重視したアプローチだと思います.プログラミング言語に例えると,PerlとかRubyみたい? SpringがSmalltalkでS2がPerlだと,なんだかSmalltalkのほうが素敵に見えてしまう気がするので,今後はそれぞれLispRubyに例えることにしましょう.(^^; あうぅ,Lisperの方,石を投げないでください!
ミニマリズムLispは,アイディアはいたってシンプルですが,それによるプログラミングがシンプルに出来るとは限りません.あぅ,Lisperの方,石を(以下略).もちろん,LispSmalltalkには長い歴史をかけて築き上げてきた強大なライブラリがあるため,かなりのことまでシンプルに出来るでしょう.でも,そのライブラリが貧弱だったら? 一方,RubyPerlの豊富な表現力は,ライブラリに頼らずとも,極めて単純なコードで強力なプログラムを実現することを可能にしてくれます(もちろん強力なライブラリもあるわけですが).同じことがSpringとS2にも言えるように思えます.
ということで,これからIoC/Dependency Injectionなコンテナを使い始めるなら,それでAOPまでやってしまおうということなら,やっぱりS2の方がよさそうです.つまらないところでつまずきやすいのがSpringなのは間違いないと思いますので.
でもSpring入門記は続きます.なんせ日記ですから(意味不明).