本文へスキップ
BecomeCoder

C#デザインパターンコース · 第3章 現代の設計パターン · レッスン22

MVC ― Model・View・Controller

ブラウザで完結

導入

「データ」「見た目」「操作の受付」がひとかたまりになったコードは、修正のたびに全体が壊れます。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つを分けることで、見た目の変更が業務ロジックに波及しない

やってみよう

CounterReset() を足し、ControllerResetAndShow() を追加してみましょう。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 です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。