2007/03/01

Strutsに見るMVC

今更ながら気付いたこと。

ご存知のことかどうかは知らないし、
君が知らなくても僕はここに書くわけだけれども、
Strutsはもう随分長い間、
プレゼンテーション層のフレームワークの長に君臨している。
ご存知のことかどうかは知らないし、
君が知らなくても僕はここに書くわけだけれども、
JSFはもう随分長い間、
「次に来るのはJSFだ」と言われて、未だに来ない。
(そして僕の同僚の優秀なエンジニアは「もう来ない」と言う)

StrutsのActionFormはMVCで言うところのモデルだ。
PACよりもDocument-ViewよりもMVCが好きな僕だが、
そんなことに今更気付いた(もう何年ですか?)。
そのことにより、Strutsはアーキテクチャパターンとして
実はMVCはそんなに気にしていないことに気付く(正確にはMVCモデル2)。
「プレゼンテーション層以外を規定しない」と言われるStrutsだけど、
ビジネス層を呼び出す責務を負うクラスが、
ActionFormではなくActionだという非常に重い規定はしている。
ActionはMVCではコントローラの扱いであり、
「小さなServlet」である。
そのActionのメソッドAction#execute(..)は、
ActioFormを引数として呼び出される。
コントローラの引数としてモデルが渡されるのである。
古典的MVC主義者にとっては驚愕の事実である。
さらにStrutsはDynaFormを導入することにより、
「モデルとしてのActionForm」を
ただの「リクエストパラメータを入れるだけの箱」にまで格下げした。

一方、JSFは比較的綺麗なMVCだ(あくまでも比較的に)。
「JSFのBackingBeanはStrutsのActionFormみたいなもの」
と説明する人達がいるが、とんでもない。
BackingBeanはあからさまにモデルオブジェクトだ。
BackingBeanとActionFormが似ているのは、
それがプレゼンテーション層に属していて、
リクエストパラメータを格納するという点だけだ。
属するレイヤが同じでも、演じるMVCの役割は異なる。
JSFはStrtusのようにむやみやたらに自作のモデルクラスを
HttpServletRequest#setAttribute(..)しない。
「リクエストの場合はActionFormだけど
表示する場合は自作のモデルクラス」という、
汚いアーキテクチャを避けることができるようだ。

「だからStrutsがダメだ」というわけではないし、
何より、未だに仕事でお世話になっている。
「だからJSFがいい」というわけではないし、
何より、未だに仕事でお世話になったことがない。


posted by SuZ at 00:30 | Comment(3) | TrackBack(0) | Programming::Java

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。