岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

WebアプリでもSmalltalkのMVCパターンが使えるかも

WebアプリのMVCSmalltalkMVC

Webアプリの実装パターンとして使われるMVCという言葉は、本来の意味でのMVC、つまりSmalltalkGUIアプリを構築する際に使われるMVCとは内容が異なります。まつもとゆきひろさんの書かれた「まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails」で解説されている通りです。

私は以前から、WebアプリのMVCは美しくないと思っていました。特に美しくないと感じるのは、モデルの処理に失敗したときにフォーム再表示用のビューを作ってエラーメッセージをassignするような場面です。SmalltalkMVCならば、処理が失敗したことをビューに通知し、ビューを更新すれば済みます。

そして、クライアントサイドにGUIがある以上、美しくないMVCがWebアプリに採用されるのは必然であるとも思っていました。クライアントサイドにあるビューを、サーバサイドにあるモデルとバインドするのは、少なくともHTMLとHTTPでは無理でしょう。

SmalltalkMVCをWebアプリに応用する

ところが、数日前にひらめきました。サーバサイドで仮想ビューを作る方法なら、Webアプリでも美しいMVCが書けるのではないか。

さきほど挙げた例のように、あるフォームからPOSTされた値に基づいてモデルの処理を行うケースでは、サーバサイドの処理がこう書けるのではないでしょうか。

  1. リクエストされたURIとHTTPメソッドから、現在クライアントサイドに表示されているビューを想定する
  2. 想定したビューと意味的に変わらない仮想ビューオブジェクトを作成する
  3. 仮想ビューにコントローラをバインドし、コントローラの処理を呼び出す
  4. 処理失敗時には、コントローラが自身にエラーメッセージを設定する
  5. コントローラにバインドされた仮想ビューのエラーメッセージが更新される
  6. 仮想ビューからHTMLを作成、クライアントに返す

抽象的で分かりづらいと思いますが、サーバサイドで完結させればWebアプリでも美しいMVCが書けそう、という着想です。バインドや仮想ビュー更新の手段としては、Observerパターンが使えると考えています。