クリーンアーキテクチャへの理解

Oct 2, 2025 2 min
#LayerComponentAbstract / ConcreteRestaurant AnalogyExplanation
1Domain (Enterprise Rules)EntityConcreteメニュー(例:カレーライス #123)ビジネス上の核となるオブジェクト。IDで同一性を識別し、属性は変更可能。顧客注文や業務ロジックの中心となる。
2Value ObjectConcrete分量、トッピング、価格不変で値の等価性によって同一性を判断。料理の構成要素や属性として扱われる。
3Domain ServiceConcrete料理長による裁定(在庫や予約状況に基づくコース構成)単独Entityに属さないドメインロジックを担当。複数Entity間のルールや判断を実装する。
4Repository InterfaceAbstract倉庫への発注窓口コックが食材を取得するための抽象窓口。実際のデータ取得手段には依存しない。
5Application (Use Case)Request DTOConcrete (data structure)注文伝票外部注文情報をアプリケーション層で処理可能な形式に変換したデータ構造。
6Input PortAbstract注文伝票の置き場コックへの業務開始命令。Use Caseの開始ポイント。
7InteractorConcrete (Input Port Impl.)コックInput Portを実装し、伝票に基づいて調理。ビジネスロジックを実行する主体。
8Response DTOConcrete (data structure)調理済みの料理料理完成後の成果物を表現。内部手順は隠蔽され、外部提供情報のみを含む。
9Output PortAbstractデシャップ(配膳カウンター)完成した料理とともに伝票をホールへ返却。Interactorと外界の橋渡しを行う。
10Adapter (UI / Interface)ControllerConcreteホールスタッフ(注文受付担当)お客様からの注文を受け、Request DTOに変換してInput Portに渡す。
11PresenterConcrete (Output Port Impl.)ホールスタッフ(料理提供担当)Output Portを実装し、完成料理をお客様に提供可能な形に整える。盛り付けや装飾も含む。
12InfrastructureViewConcreteお客様のテーブル実際に料理が提供される場所。フレームワーク依存の表示処理を含む。
13DAOConcrete(Repository Impl.)仕入担当食材の仕入れや在庫管理を担当。Repository Interfaceを具体的に実装し、データベースや外部サービスと連携。

1. Domain Layer(組織ルール層)

Entity

  • 定義:同一性(Identity)を持つ本質的対象。属性の変更可能性は本質的な問題ではなく、IDに基づく同一性の保持が核心。
  • ポイント:Entityは「変化する属性の中で不変の本質を保持する存在」と考えられる。メニュー番号や顧客IDはその象徴。

Value Object

  • 定義:属性の集合としてのみ意味を持つオブジェクト。不変で等価性によって同一性を判定。
  • ポイント:「値は属性の集合体であり、自己の同一性はその内容に内在する」。IDは不要。価格や分量、座標など、振る舞いよりも状態の整合性が重要な要素に適用。

Domain Service

  • 定義:単一Entityに属さない、ビジネスロジックを表現するオブジェクト。
  • ポイント:「Entity間の関係や協調を扱う抽象的存在」として、ドメインのルールを形而上に実装。

Repository Interface

  • 定義:永続化を抽象化したインターフェース。データ取得手段に依存せず、Entity操作の契約を提供。
  • ポイント:「ドメインはデータアクセスの存在を知らない」。永続化の具体実装を意図的に隠蔽。

2. Application Layer(ユースケース層)

Request DTO

  • 役割:外部からの要求をアプリケーション層で扱えるデータ構造に変換。

Input Port / Interactor

  • Input Port(抽象):ユースケース実行の契約。Interactorに渡す「命令の型」。
  • Interactor(具体):ユースケースの実装。ビジネスルールを呼び出し、ドメインに指示を与える。

Response DTO / Output Port

  • Response DTO:処理結果を外部に返すための構造化された情報。
  • Output Port:Interactorが結果を渡す契約。具体実装(Presenter)が整形して外界に提供。

3. Adapter Layer

Controller

  • 定義:外部からの入力を受け取り、Request DTOに変換し、Input Portに渡す。

Presenter / View

  • Presenter:Output Portの具体実装。内部結果を表示可能な形に整形。
  • View:ユーザーとの接点。フレームワーク依存の表示や操作を実行。

4. Infrastructure Layer(永続化・外部依存)

DAO / Repository Impl.

  • 定義:Repository Interfaceを具体的に実装。データベースや外部サービスとのやり取りを担当。
  • ポイント:「ドメインに汚染されることなく、永続化や外部連携の具体を担う」。

5. 総括的理解

  • ポートとアダプタ:境界と契約を明示し、ドメインの純粋性を保つための手段。
  • Entity vs Value Object:変化の中の不変性(Identity)と、値としての不変性(Value)を明確に分離。
  • ドメイン中心設計の核心:ビジネスルールを中心に据え、外界や永続化への依存を極力隠蔽する構造。
  • 抽象と具象の階層:抽象は契約、具象は実行。境界を超える情報の変換がユースケース層の役割。

キーワード:境界(Boundary)、契約(Contract)、純粋性(Purity)、抽象化(Abstraction)、実行(Execution)、分離(Separation of Concerns)

~Yu Tokunaga