導入
「データ」「見た目」「操作の受付」がひとかたまりになったコードは、修正のたびに全体が壊れます。MVC は、これらを Model(データ・業務)/View(表示)/Controller(入力の受付と橋渡し) の3つに分ける設計です。Webフレームワークの多くが採用しています。
図解
flowchart LR
U["ユーザー操作"] --> C["Controller<br/>入力を受け取る"]
C --> M["Model<br/>データ・業務ルール"]
M --> C
C --> V["View<br/>結果を表示"]
style C fill:#e1f5fe
style M fill:#e8f5e9
style V fill:#fff3e0
サンプル
var controller = new CounterController();
controller.Increment();
controller.Increment();
controller.Show(); // カウント: 2
// Model: データと業務ルール
class Counter { public int Value { get; private set; } public void Add() => Value++; }
// View: 表示だけ
class CounterView { public void Render(int value) => Console.WriteLine($"カウント: {value}"); }
// Controller: 入力を受けて Model を動かし、View に渡す
class CounterController
{
private readonly Counter _model = new();
private readonly CounterView _view = new();
public void Increment() => _model.Add();
public void Show() => _view.Render(_model.Value);
}
- Model:データと業務ルール(表示を知らない)
- View:表示だけ(業務を知らない)
- Controller:入力を受け、Modelを動かし、Viewに渡す橋渡し
- 3つを分けることで、見た目の変更が業務ロジックに波及しない
やってみよう
Counter に Reset() を足し、Controller に ResetAndShow() を追加してみましょう。View と Model を触らずに新しい操作を足せることを体感できます。
演習
class Message { public string Text { get; set; } = ""; }
class MessageView { public void Render(string t) => Console.WriteLine($"[表示] {t}"); }
// TODO: Model と View を持ち、Set(text) で Model に保存し Show() で View に表示する MessageController を定義してください
___
var c = new MessageController();
c.Set("hello");
c.Show(); // [表示] hello
- 期待される出力:
[表示] hello
ヒント1を見る
class MessageController { private readonly Message _m = new(); private readonly MessageView _v = new(); public void Set(string t) => _m.Text = t; public void Show() => _v.Render(_m.Text); }
ヒント2を見る
Controllerは自分でModelとViewを持ち、両者の橋渡しをします
まとめ
- MVCは関心を Model/View/Controller の3つに分ける
- 表示の変更が業務ロジックに波及しなくなる
- Web・デスクトップの多くのフレームワークの土台
次回: データバインディングの心臓、MVVM です。