2008年12月13日土曜日

DIとかAOPについて考えてみた

フレームワークって何だろう。最近Spring frameworkとかSeasarを試して考えさせられました。

(現時点での感想です。今後評価は変わるかもしれません)

なぜエンジニアはフレームワークを求めるのか。

開発生産性の向上とか、スキルの蓄積とか、そういう一般論やセールストークは脇においておきましょう。

フレームワークとは何か。フレームワークを使うものはフレームワークから使われる。ハリウッドの法則とも呼ばれます。これがフレームワークの本質のひとつです。フレームワークがメインで稼動し、開発者はフレームワークが呼ぶ部品を作る。この部品はフレームワークが定めるお作法に則って作成されなければなりません。つまり開発者はフレームワークが規定する型にハマったコードを書く必要がある。すなわち、フレームワークとは「アプリケーションこうあるべし」と定めるものです。しかも実装レベルで定めます。フレームワークに従わなければ稼動することもできません。

Strutsの目指したものは何だったか。もちろん、Webアプリケーションをシンプルに手早く開発することです。今思えば0.9時代のStrutsの抽象度は低く、またフレームワークにしては強制力が弱く柔軟に過ぎていました。しかしHTMLのインプットフォームをFormビーンにマッピングする発想(抽象化)と、画面遷移とBeanをXMLで定義する設計(疎結合)は非常に先進的であったと思います。

それではSpringの目指すものは何なのか。
Spring is a layered Java/J2EE application platform, based on code published in Expert One-on-One J2EE Design and Development by Rod Johnson (Wrox, 2002).

すなわちロッド・ジョンソン氏が提唱した、アプリケーションのデザインパターンの実装です。細かいところは省きますが、要するにSpringはStrutsとは異なり直接的な何らかの成果物を目標としているのではなく、より理念的なもの(概念と言ってもいいですし、思想、デザインと言ってもいい)を目指しているのです。それがSpringや(恐らくはSeasarも)をとっつきにくくしている理由のひとつであると思われます。

私はこのことが、つまり「目的が抽象的であること」がSpringフレームワークの問題だと思います。なぜか。私はそこにわれわれの業界に付きものの「手段と目的の逆転」が起こっていると見るからです。

なぜSpringを使うのか。Springを使うモチベーションとは何か。Springの位置づけからすると、それは「よいデザインパターンを実装するためである」ということになります。しかしちょっと待ってください。よいデザインパターンを実装するために、われわれはコードを書いているのでしょうか?コードを書くのは、何かやりたいことがあると思います。よい設計のためにコードを書く?そんなことがありえるでしょうか。

確かにオブジェクトをXMLから挿入できるDIや、横断的に割り込み処理をするAOPはよい発想だと思います。しかし、われわれはDIをするためにコードを書いているのではありません。DIやAOPは、あれば便利かもしれないもの。気の利いたスキマ商品なのではないか、と私は思います。例えるなら高級システム手帳。あったらうれしい。使いこなす人はカッコいいと思う。でも・・・別にいらないや。

Spring frameworkを開発する方の熱意と才能はすばらしいと思います。あんなものとても私には作れない。「よいフレームワークを提供して使って欲しい」「いいデザインのアプリケーションを作って欲しい」という熱意はまさに尊敬に値します。

でも私にはSpringは違和感がある。Data Injectionやるためにアプリ作ってんじゃねーや。と思ってしまう。

DBとエレガントに連携し、読みやすいコードで書きたいなら、HibernateやJPA(EJB3.0)を使うでしょう。

Webアプリを効率的に作ろうと思ったら、今の私なら躊躇なくJSFを選びます。

しかし、DIとAOPを使いたいから、XMLでデータや横断的処理を挿入したいからSpringを使うか?使わないと思うな。というかSpringとEJB3.0を連携させる体力の余裕があったら他に回すよね。

ということで、以上が現段階での私のSpring観です。否定的ってことで。

以上
.
(2008/12/15追記)
DIって本当に必要? - ひがやすを blogを見ると、Seasarのコミッタの方も真剣に自問しているようですね。偉い!偉いぞ!!
同じページで、普通の業務アプリケーションにはインターフェースはいらないんじゃないか、と言ってますがこれも偉い!!!よくぞ言った。必要だから使う、ではなく、ただ「インターフェースを使って設計しなきゃいけない」という強迫観念に襲われがちじゃありませんか?こういう問題提起・洞察は非常に重要です。
.

0 件のコメント: