0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#0112(2025/04/20)Model-View-Controller(MVC)とは

Posted at

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の再確認はきっとあなたのコードに深みを与えてくれるはずです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?