📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

多層アーキテクチャとMVC・MVVM・DDD

概要

  • 日程: Day 3 / セッション 04
  • 時間: [10:40-11:25]
  • 形式: 実習
  • ゴール: MVC・MVVM・DDDの違いを図で説明でき、自チームの開発に最適なものを根拠とともに1つ選択できる
  • 学習形式: ハンズオン実習(AI比較分析あり)

導入(5分)

前セッションでは「設計アプローチ」という大きな分類を見ました。今度はそれを実装に落とすときに使う「具体的な構造パターン」です。

エンジニア界隈で最もよく耳にする「MVC」「MVVM」「DDD」。聞いたことはあっても、違いを説明できる人は意外と少ない。本セッションでは、これらの構造を図で理解し、自チームに合うものを選択します。

ベースになるのが「多層アーキテクチャ」、特に3層アーキテクチャです。これは「家を1階・2階・3階に分ける」発想で、システムを階層に分けて責務を整理する考え方です。

本編(35分)

1. 3層アーキテクチャ(基盤)

ほぼすべての業務システムが、何らかの形で「3層」に分かれています。

flowchart TD A["プレゼンテーション層
(UI / 画面)"] --> B["ビジネスロジック層
(業務ルール)"] B --> C["データ層
(DB / 永続化)"]
役割
プレゼンテーション層 利用者との入出力 HTML/CSS/JS、画面、フォーム
ビジネスロジック層 業務ルールの実行 「注文金額が1万円超えたら送料無料」
データ層 データの永続化 RDBへのSELECT/INSERT

ここがポイント

3層に分ける目的は「変更の影響を局所化する」こと。画面の色を変えたいだけなのにDBの構造を変えなければならない、という事態を防ぎます。

コラム

3層アーキテクチャの起源は1980年代後半、クライアント・サーバ型システムの普及とともに広まりました。それ以前は「2層(クライアント+DBサーバ)」が主流で、業務ロジックがクライアント側のFat Clientに詰め込まれていました。1990年代、Webブラウザが普及すると、ロジックをサーバ側に集中させる必要が出てきて、3層化が一気に進みました。

2. MVC(Model-View-Controller)

3層アーキテクチャを「プレゼンテーション層の中で」さらに細かく分けたパターン。1979年、Smalltalkで考案。

flowchart LR U["ユーザー"] --> C["Controller"] C --> M["Model"] M --> V["View"] V --> U M --> V
要素 役割
Model データと業務ロジック(料理人)
View 表示(料理を盛る皿)
Controller 入力受付と振り分け(ホールスタッフ)

代表例: Ruby on Rails、Django、Spring MVC、ASP.NET MVC

3. MVVM(Model-View-ViewModel)

MVCを「双方向データバインディング」前提に改良したパターン。2005年、MicrosoftがWPF用に考案。フロントエンド開発で主流。

flowchart LR V["View"] --> VM["ViewModel"] VM --> V VM --> M["Model"] M --> VM
要素 役割
Model データと業務ロジック
View 表示(HTMLテンプレート等)
ViewModel Viewのための整形・状態管理

代表例: Vue.js、Angular、Knockout.js、WPF

ここがポイント

MVVMの肝は「ViewとViewModelが自動で同期する(バインディング)」こと。ViewModelの値が変わるとViewが勝手に更新される。Reactは厳密にはMVVMではない(Flux/Reduxパターン)が、似た発想を持つ。

4. MVCとMVVMの違い

flowchart TB subgraph MVC["MVC"] C1["Controller"] --> M1["Model"] M1 --> V1["View"] end subgraph MVVM["MVVM"] V2["View"] --> VM2["ViewModel"] VM2 --> V2 VM2 --> M2["Model"] M2 --> VM2 end
観点 MVC MVVM
ユーザー入力 Controllerが受ける Viewが受けてViewModelに伝える
ViewとModelの関係 Controllerを介す ViewModelを介してバインディング
主な使用環境 サーバサイドWeb リッチクライアント・SPA
テストのしやすさ Controllerをテスト ViewModelをテスト(UI非依存)

5. DDD(Domain Driven Design)ドメイン駆動設計

2003年、エリック・エヴァンスが提唱。複雑な業務ロジックを持つシステムに有効。MVCやMVVMが「層の分け方」だとすれば、DDDは「業務(ドメイン)の表現の仕方」を主題にする。

flowchart TD subgraph UI["プレゼンテーション層"] U1["コントローラ"] end subgraph APP["アプリケーション層"] A1["ユースケース"] end subgraph DOMAIN["ドメイン層 (中心)"] D1["エンティティ / 値オブジェクト / ドメインサービス"] end subgraph INFRA["インフラ層"] I1["リポジトリ実装 / DB / 外部API"] end UI --> APP APP --> DOMAIN INFRA --> DOMAIN

DDDの主要キーワード:

  • ユビキタス言語: 開発者と業務担当者が同じ言葉を使う(例: 「ユーザー」ではなく「会員」など)
  • エンティティ: IDで識別される業務オブジェクト(例: 注文)
  • 値オブジェクト: 値そのものに意味がある(例: 金額、住所)
  • 集約: 整合性を保つ単位(例: 「注文」とその「注文明細」群)
  • リポジトリ: 永続化を抽象化(DBアクセスの詳細を隠す)
  • 境界づけられたコンテキスト: 用語の意味が一貫する範囲

ここがポイント

DDDは「業務が複雑」なときに真価を発揮します。CRUDだけのシンプルなシステムにDDDを持ち込むと、過剰設計になります。「ドメインが複雑か?」が判断軸です。

コラム

エリック・エヴァンスの『ドメイン駆動設計』(青本)は600ページの大著で「読破した人は少ない」ことで有名。多くの人は『実践ドメイン駆動設計』(赤本)から入ります。さらにエンジニアの増田亨さんの『現場で役立つシステム設計の原則』は日本人にとって理解しやすいDDD入門書として広く読まれています。

6. デザインパターン(GoF)

設計には「定番の解法」があります。1994年、Gang of Four(GoF:Gamma・Helm・Johnson・Vlissides)が23のデザインパターンを書籍化しました。

代表的なもの:

  • Singleton: インスタンスを1つに制限
  • Factory: オブジェクト生成を専門の関数/クラスに任せる
  • Observer: 変更を購読者に通知(イベント駆動の原型)
  • Strategy: 振る舞いを差し替え可能にする

ここがポイント

パターンは「名前」が大事です。「Strategyパターンで」と言えば、チームに伝わります。料理で言う「カラメリゼ」「ジュリエンヌ」のような共通言語です。

💬 AIに聞いてみよう

ここまでの内容で疑問があれば、AIに質問してみましょう。たとえば:

  • 「MVCとMVVMをReactで比較したらどうなる?」
  • 「DDDのユビキタス言語の具体例を、ECサイトを題材に作って」
  • 「自分のチームの開発テーマでDDDは過剰設計? 判断して」

実習(10分)

課題

チームで以下を実施してください。

  1. 自チームの開発テーマに対し、MVC / MVVM / DDD のどれを採用するかを議論
  2. AIに「自分たちのテーマ(〜)でMVCを採用した場合の構成図と、MVVMを採用した場合の構成図を比較して」と質問
  3. 採用理由を3行でメモ

成果物

  • 採用するアーキテクチャ(1つ)
  • 採用理由(3行)
  • 簡単な構成図(Mermaidまたは手書き)

ヒント

  • 「リアクティブなUIが必要」→ MVVM寄り
  • 「ドメインが複雑(業務ルールが多い)」→ DDD
  • 「シンプルなCRUDで素早く作る」→ MVC

まとめ(5分)

3層アーキテクチャを土台に、プレゼンテーション層を整理するパターンとしてMVC・MVVMがあります。一方DDDは業務ドメインの複雑さに対処する設計思想です。これらは「対立」ではなく「組み合わせ」が可能です(例: DDDの中にMVVMのフロントエンドが入る)。

次のセッションでは、今日まで出てきた「アーキテクチャ」「設計」「駆動」「アプローチ」「パターン」という似たような言葉の違いを整理します。

🔄 振り返りチェック

  • MVCとMVVMの違いを図で説明できますか?
  • DDDが向くプロジェクト・向かないプロジェクトを区別できますか?
  • 自チームの選択と理由を3行で言えますか?

補足資料

  • 参考リンク: エリック・エヴァンス『ドメイン駆動設計』、増田亨『現場で役立つシステム設計の原則』、GoF『デザインパターン』
  • 発展課題: 自分が使っているフレームワーク(Express、Next.js、Vue、Laravelなど)がMVC/MVVMのどちらに近いか分析

学習ガイド

想定される質問と回答例

質問 ヒント
ReactはMVC? MVVM? 厳密にはどちらでもない。FluxやReduxはMVC寄り、Vueに近い書き方はMVVM寄り。設計者の意図次第
DDDは必ず複雑になる? はい。学習コスト高。CRUDアプリには向かない
3層アーキテクチャと多層アーキテクチャの違いは? 3層は層数を限定した呼び方、多層は2層〜n層を含む総称

つまずきやすいポイント

つまずきポイント ヒント
MVVMのデータバインディングが想像できない Vue/AngularのHello Worldを動かすと一発で分かる
DDDの用語が多すぎる まず「エンティティ」「値オブジェクト」「リポジトリ」の3つだけ。残りは必要時に
どれを選んでも正解な気がして決められない チームの経験値・テーマの複雑さ・期限の3つで決める
読み上げを開始します...

AIに質問する