Model-View-Controller(MVC)とは何か?本質と実践を徹底解説
フレームワークや設計に慣れてくると、こんな疑問が浮かぶことがあります。
「MVCって、見た目とロジックを分けるだけなら、フロントとバックを分けてる今どきのアーキテクチャで十分じゃない?」
あるいは、
「型定義と処理を分けてるし、もうModelとController分離できてるんじゃないの?」
この記事では、そうした疑問を明確にしながら、MVCの本質と実践、そしてModelが担うべき“深い責任”まで丁寧に解説していきます。
🔰 MVCとは?
MVC(Model–View–Controller) とは、アプリケーションを次の 3 つの責任に分けて構成する設計パターンです:
層 | 主な役割 |
---|---|
Model | データ構造、ビジネスロジック、ドメインルール、永続処理 |
View | UIや出力の定義。Modelの状態を表示に変換 |
Controller | ユーザー操作を受け取り、ModelとViewを連携させる交通整理役 |
✅ MVCのメリット
- 変更が局所化できる:見た目の変更でControllerやModelをいじらずに済む
- テストしやすい:ロジックとUIが分かれているため、単体テストが容易
- 再利用しやすい:モデルロジックがViewに依存しないため、API化やCLI対応も楽
- チーム開発しやすい:責任分担が明確
💡 よくある誤解と疑問への回答
Q1. 「見た目とロジックを分けるなら、フロントとバックを分ければいいのでは?」
これは半分正解で、半分不十分です。
- フロントとバックを分けるのは アプリの外側の分離(ネットワーク越し)
- MVCは アプリ内部構造の分離(コードレベル)
つまり、フロントエンド/バックエンド分離とMVCは別の層の話なんです。
Q2. 「型定義と処理を分けたら、ModelとControllerを分けたことになる?」
答えはNo。型分離はMVCの一部にすぎません。
MVCにおけるModelは、次の3つの責任を持ちます:
- ビジネスルール
- ドメインルール
- 永続処理(DB保存・取得など)
単なるデータ構造(例:class User(BaseModel)
)や型定義だけではModelの一部にしか過ぎないのです。
🔍 Modelの本当の役割とは?
🔹 1. ビジネスルール(Business Rules)
業務全体における判断・条件・ルール。
class Order:
def shipping_fee(self):
return 0 if self.total_amount >= 10000 else 500
🔹 2. ドメインルール(Domain Rules)
特定の業務領域での意味のある状態変化・制限など。
class Task:
def complete(self):
if datetime.now() > self.deadline:
raise ValueError("期限切れのタスクは完了できません")
self.status = "完了"
🔹 3. 永続処理(Persistence)
データベースやファイルへの保存・読み出しなど。
db.session.add(task)
db.session.commit()
🧪 具体例:Flask で作る簡易TODOアプリ
model.py
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
done = db.Column(db.Boolean, default=False)
def toggle(self):
self.done = not self.done
controller.py
@app.route("/toggle/<int:id>")
def toggle(id):
todo = Todo.query.get(id)
todo.toggle()
db.session.commit()
return redirect(url_for("index"))
templates/index.html
{% for t in todos %}
<li>
<form action="/toggle/{{ t.id }}" method="post">
<button>{{ '✅' if t.done else '⬜️' }}</button>
</form>
{{ t.title }}
</li>
{% endfor %}
🎯 MVCの本質
MVCとは単に「表示と処理を分ける」ことではなく、アプリケーションを役割単位で分割する設計思想です。
- Model:データと振る舞い(意味・ルール)をまとめる“知的な存在”
- Controller:入力→処理→出力の流れを司る“交通整理役”
- View:Modelの状態を画面に描くだけの“受け身な存在”
✅ 結論
よくある誤解 | 正しい理解 |
---|---|
フロント/バックで分けてるからMVC不要 | MVCはアプリ内部の構造整理に必要 |
型定義を分ければModel | Modelにはロジックや保存処理も含む |
Controllerはただの関数集 | Controllerは“使い方”の定義(ModelとViewの連携役) |
MVCをただの「古いパターン」と侮ることなかれ。
設計の奥深さを知る一歩として、MVCの再確認はきっとあなたのコードに深みを与えてくれるはずです。