勉強日記

チラ裏

PoEAA ch14 Model View Controller

martinfowler.com


Model View Controller

Splits user interface interaction into three distinct roles.

  • 最も多く引用される(そして、もっとも間違って引用される)パターンの一つ
  • 歴史
    • 1970s
    • by Trygve Reenskaug
    • Smalltalkプラットフォーム
  • UIフレームワークやUI設計に多くの影響を与えた

How It Works

  • Model
    • ドメインの情報を表現
      • UI以外のすべてのデータと振る舞いをもつ
      • Non-visual
    • Domain ModelとかTransaction Scriptとか
  • View
    • ModelをUIで表示
    • 表示だけ
  • Controller
    • 情報の変更を担う
      • ユーザ入力を受け取る
      • モデルを操作する
      • ビューを更新する
  • UIはViewとControllerとのコンビネーションであるといえる
  • 主要な分離は2つ:
    • ModelからViewの分離
    • ViewからControllerの分離

ModelからViewの分離

  • 重要
  • この分離が重要な理由
    • 両者は関心が異なる
      • View
        • UIのメカニズム
        • よいレイアウト
      • Model
        • ビジネスポリシー
        • DBインタラクション
    • 同じModelを異なる見せ方で表示したいことがある
    • Non-visualなもののほうがテストしやすい
      • Modelはテストしやすい
      • GUI(Viewの一種)のテストはやっかいなので分離する
  • 依存の方向がミソ
    • View -> Model
      • Modelに影響を与えること無くViewを変更・追加できるよう
  • 複数のViewを同時に表示するときどうするの
    • あるView上からModelに変更を加えた
    • 他のViewも変更に追従させたい
    • ModelからViewに教えてあげることはできない
      • ModelはViewを知っていてはいけないから
    • GoFのObserver Pattern使え
      • Modelは変更されたらevent発行
      • Viewはeventをリッスンして情報再表示

ViewからControllerの分離

  • 前者ほど重要ではない
  • 皮肉にも、MVCの先駆けであるSmalltalkが、この分離をできていなかったりする
  • なんで分けるの
    • 1Viewに対して2つのControllerを持たせたりできる
      • 例: 編集可能/不可能で切り替え
        • Strategy Pattern
    • しかし現実的には1View - 1Controllerで、分離されなかったりする
  • ほとんどのGUIフレームワークがViewとControllerとを合体させてしまうので、MVCへの誤解につながった
    • ModelとViewはわかるけどControllerはどこ?
    • ModelとViewとの間にあるよという考え方
      • PofEAAでいうApplication Controllerパターン
        • 【補】contextに応じてModelとViewの出し分けだけ担うやつ
      • MVCのCとは全然異なる
  • MVCについてもっと深く知りたけれぱPOSAを読め

When to Use It

  • MVCパターンで重要なのは、先述の2つの分離
  • とくにViewとModelとの分離が重要
    • 分離しなくていいのは、非常にシンプルなシステムの場合のみ
      • 【補】Smart UI Antipatternってやつ
      • Modelがロジックを持たない
    • Modelがロジックを持ち始めたら直ちに分離せよ
  • ViewとControllerとの分離はそれほど重要ではない
    • 本当にメリットがある場合のみ分けるとよい
      • リッチクライアントではふつう分けない
      • Webフロントエンドでは分けるのが普通

英語

  • vogue
    • 流行り