Hanssonが、「JavaScript勢はダブルMVCで苦しんでいる。サーバとクライアント両方にMVCが必要で複雑すぎる。」とTwitterで発言したのに対して、Yehudaは、それでは誤解を与えると危惧し、GUIプログラミングが歴史的にどのようにMVCに発展してきたかを紹介することで、ダブルMVCが本当に意味するところを解説しています。Node.js勢に対する単なる批判っぽいですが、それに対してYehudaはロジカルに話をまとめてます。(31分)をご欄ください。UIを更新する70年代のプログラミングもしくは2005年のjQueryではマニュアル作業方式と言える。Handlerがやる。logicとドメインlogicが同じところにあるのはまずいと気づいた。(表現とModelを分離する)」というコンセプトが、SmalltalkやBackboneで採用された。Modelの構成である。ViewはModelにアクセスできるが、ModelはViewにアクセスできない。ModelはViewにオブザーバを介して通知する。Modelの関係になり、ViewとControllerは直接アクセスしていた。オブザーバの仕組みが複雑なものには実用的でないという背景があった。View、3)4)5)はController、6)はオブザーバだが簡単なものならController、7)はViewとなった。4)5)は特別なオブジェクトが扱うので、システム内部は、どのようになるのかの明確な答えはもってない。オリジナルのMVCで問題なのは、どこでUIが起動されるのか、UIの階層は重要だが複数のアプローチが可能な場合、MVCは特定のフレームワークが適用されるのにアプリstateはシステムのどこにでも保管されてしまうこと。RailsはMVCではないという話しもあるが、GUIデザインパターンが当てはまることは間違いない。シンプルなRailモデルにおいてブラウザはブラックボックス。UIが先にレンダリングしてユーザがやるかもしれないアクションに対応できるように準備し、実際のユーザインプットをブラウザに渡す。ブラウザはHTTPを介してControllerとやりとりする。これは従前の事例と同じ普通のUIパターンの範疇であるが、違うのは、ユーザイベントの全ての可能性を事前に計算することを強制されること、ブラウザがやることがほとんど見えないこと、HTTPで情報を送り、ページが再読み込みされるということ。[Videoのスライド参照。スライドではViewまわりの矢印が記載漏れになってます。(ActiveRecord経由で保管)、6)はHTTP、7)はブラウザが担当する。Railsの問題としては、まず、UIの階層を扱うのは大変。ブラウザで管理している(ユーザのカーソルがどこにフォーカスしてるかなどの)stateを利用するか、もしくはページを再読み込みするかの選択が必要。ブラウザのstateとRailsのstate管理は遠く離れたところにありやりとりしない。ユーザがインタラクションするパターンがリンクとフォームに制限される。JavaScriptを絡ませたとしても全体の構成は変わらないので、ページ全体を再読み込みすることになる。RailsはSmalltalkやCocoaのベストプラクティスを導入できてない。メリットとしては、Viewの準備と描画を切り離せる、また、イベントハンドリングとその解釈を描画と別に扱える。Controllerのイベントを送ってアプリの別の箇所を更新して対応する。Controller、6)はオブザーバもしくはController、7)はViewが担当する。CocoaはオリジナルのMVCの問題であるUIの階層に対応している。ユーザが画面の一部をタッチした処理を上位レイヤに投げて、どう処理をすれなよいかわかっているレイヤに到達すれば実行されるので、フレームワークとアプリのstateがうまく連携できている。Controllerをうまく管理すること、オブザーバシステムの限界、ブラウザURLがある。[時間切れで詳細説明が割愛された。]Emberでは、同じような仕組みが採用されている。MVCよりも上位レイヤの処理については、Viewから該当するRouteまでイベントが送られ、ここはCocoaのようにマニュアルでなく、Ember側で管理してくれる。Binding、7)はテンプレートが担当する。Albumの3つのテンプレートがあった場合、EmberはCocoaとは違って、そのテンプレートの階層されぞれに、自動的に該当するRouteやControllerを配置してくれる。EmberはUIの全てを扱ってくれる。Emberが基本的なMVCを担い、Railsはデータのpersistentをする役割をもっているということ。データのpersistentはAmazonの購入商品ステータス管理でわかるように重要な役割。MVCというのはクライアントにおけるEmberやBackboneか、サーバにおけるRailsが基本。(2つのMVCが重なってコンフリクトを起こすというものではない。)ダブルMVCが成り立つのは、「EmberがMVCを担っているが、Railsが商品ステータスの更新のところだけUIのMVCの役割をもっている。」というようなパターンのみ。#アーキテクチャBack。