WebアプリでもSmalltalkのMVCパターンが使えるかも
WebアプリのMVCとSmalltalkのMVC
Webアプリの実装パターンとして使われるMVCという言葉は、本来の意味でのMVC、つまりSmalltalkでGUIアプリを構築する際に使われるMVCとは内容が異なります。まつもとゆきひろさんの書かれた「まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails」で解説されている通りです。
私は以前から、WebアプリのMVCは美しくないと思っていました。特に美しくないと感じるのは、モデルの処理に失敗したときにフォーム再表示用のビューを作ってエラーメッセージをassignするような場面です。SmalltalkのMVCならば、処理が失敗したことをビューに通知し、ビューを更新すれば済みます。
そして、クライアントサイドにGUIがある以上、美しくないMVCがWebアプリに採用されるのは必然であるとも思っていました。クライアントサイドにあるビューを、サーバサイドにあるモデルとバインドするのは、少なくともHTMLとHTTPでは無理でしょう。
SmalltalkのMVCをWebアプリに応用する
ところが、数日前にひらめきました。サーバサイドで仮想ビューを作る方法なら、Webアプリでも美しいMVCが書けるのではないか。
さきほど挙げた例のように、あるフォームからPOSTされた値に基づいてモデルの処理を行うケースでは、サーバサイドの処理がこう書けるのではないでしょうか。
- リクエストされたURIとHTTPメソッドから、現在クライアントサイドに表示されているビューを想定する
- 想定したビューと意味的に変わらない仮想ビューオブジェクトを作成する
- 仮想ビューにコントローラをバインドし、コントローラの処理を呼び出す
- 処理失敗時には、コントローラが自身にエラーメッセージを設定する
- コントローラにバインドされた仮想ビューのエラーメッセージが更新される
- 仮想ビューからHTMLを作成、クライアントに返す
抽象的で分かりづらいと思いますが、サーバサイドで完結させればWebアプリでも美しいMVCが書けそう、という着想です。バインドや仮想ビュー更新の手段としては、Observerパターンが使えると考えています。