プログラミング学習記録

PHPを中心に学習しています。学んだ事、つまずいた事、解決方法などを発信していきます!

MVCとは

ドメイン駆動設計(DDD)とは、2003年にエリック・エヴァンス氏が『Domain-driven design』という書籍にて提唱したソフトウェア開発手法 顧客と開発者が業務を戦略的に理解し、共通の言葉を用いてシステムを発展させていく設計手法

ドメイン ドメインとは対象とする事業が取り扱う世界を表しています。この世界には独自のルールと文化が存在しています。良い開発を行うためには、この世界をチームメンバーが深く理解する必要があります。しかし、すべての仕組みを理解するにはあまりにも大きく複雑すぎるため、通常は「コアドメイン」「サブドメイン」という適切な大きさに分割します。

エンティティ 一意なものを表現する概念です。一意であるため、長期にわたって変化できるオブジェクトとなります。

リポジトリリポジトリ」とはデータの「保管庫」を表します。ソースコードリポジトリであればGitやApache Subversionが有名ですが、DDDにおけるリポジトリは、エンティティや値オブジェクトから構成される集約の格納と取得を担当します。リポジトリは、クライアントへ集約を提供し、背後のデータベースとのやり取りを隠ぺいします。

 通常、集約とリポジトリの関係は一対一になります。例えば「注文」の集約を利用したい場合「注文リポジトリ」を使用します。クライアント側はリポジトリのおかげで、物理的な構成(RDBなのか、NoSQLなのか等)を意識せずに、簡単に集約を操作できます。

サービス DDDでは、エンティティ、値オブジェクト、集約といった「ドメインオブジェクト」だけではなく、それらの外に記述したほうがよいロジックも存在します。そのようなときに、状態を持たないステートレスな「サービス」を使用できます。サービスには、大きく分けて次の2つが存在します。

ドメインサービス:エンティティや値オブジェクトの責務ではないドメインモデルのロジック(複数のドメインオブジェクトを使って計算する処理やファサード) アプリケーションサービス(詳細は14章):非常に薄く、ドメインモデル上のタスクの調整に使うロジック(腐敗防止層の変換・アダプター等)

MVC(Model View Controller モデル・ビュー・コントローラ)は、アプリケーションを実装するためのデザインパターンです。 PHPフレームワークであるLaravelなどもMVCの概念を用いている

ルーティングも重要であるため、RMVCと覚えておくといい

routing:ユーザーのリクエスト URL controller: 入力(ユーザーのリクエスト)を受け取りmodelとviewへの命令に変換する model: アプリケーションデータ、ビジネスルール、ロジック、関数 view: グラフや図などの任意の情報表現 ユーザへの表示

レイヤアーキテクチャというのはアプリケーションを責務に応じたいくつかの層としてとらえる設計手法のことです。

ユーザインタフェース層 ユーザに情報を表示し、ユーザの入力を解釈する。MVCではV ・アプリケーション層 ドメイン層のオブジェクトを協調させる。ビジネスに関する知識を持たず、作業を調整するだけ。 MVCではC ・ドメイン層 いわゆるビジネスロジックを表現する。一番重要な層。MVCではM  ・Entity:業務(独自)データを保持するためのクラス(Entityクラス)を作成する。  ・Repository:業務(独自)データを操作するためのメソッドを実装し、Serviceクラスに提供する。業務データを操作するためのメソッドとは、具体的には、Entityオブジェクトに対するCRUD操作となる。  ・Service:業務(独自)ロジックを実行するためのメソッドを実装し、アプリケーション層に提供する。業務ロジック内で必要となる業務データは、Repositoryを介して、Entityオブジェクトとして取得する。 ・インフラ層 上位レイヤを支える一般的な技術。MySQLとかRedisとか。

レイヤーが分離できていないと、特定のレイヤーが肥大化してしまう Fat Model

ドメイン層のモデルはさらに分割する エンティティ

リポジトリ

サービス