Prism Architectureのレイヤー定義
読書時間: 約12分
はじめに
Prism Architectureはアプリケーションを、それぞれが特定の責任と境界を持つ個別のレイヤーに整理します。この層状のアプローチにより、情報と操作の実用的な流れを可能にしながら、明確な関心の分離が作成されます。これらのレイヤー—その目的、主要コンポーネント、および他のレイヤーとの相互関係—を理解することは、Prism Architectureを成功裏に実装するために不可欠です。
このドキュメントでは、各レイヤーを詳細に定義し、その役割、主要コンポーネント、および他のレイヤーとの関係を説明します。
Core Layer(コア層 / 中核層)
Core Layerは、アプリケーションの本質的な概念を定義する安定したドメインモデルと基本的な抽象化を含む、Prism Architectureの基盤を形成します。
目的
Core Layerはアプリケーションの安定した核として機能します:
- 基本的なビジネスエンティティと値オブジェクトを定義
- システム全体で使用される基本的なデータ構造を確立
- 他のレイヤーが実装するコアプロトコルを提供
- アプリケーション全体の共有語彙を作成
主要コンポーネント
-
Entities(エンティティ): 重要なドメイン概念を表す明確なアイデンティティを持つオブジェクト
- 一意の型付き識別子(ValueObjectIDとして実装)を持つ
- 最小限の振る舞いを含む
- 主要なドメインオブジェクトを表現する
-
Value Objects(値オブジェクト): その属性によって定義される不変オブジェクト
- 独自のアイデンティティを持たない(すべての属性に基づく等価性)
- ドメインの記述的な側面を表現する
- その値に関連する検証ロジックを含むことがある
- 型安全なエンティティ識別のための特殊なValueObjectIDを含む
-
Enumerations(列挙型): 関連する値の有限セットを定義
- 概念的なセット(ステータス型、カテゴリー)を表現
- 複数のエンティティにわたって使用される
- 安定していてめったに変更されない
-
Core Protocols(コアプロトコル): 契約を確立するインターフェースを定義
- 実装なしで振る舞いを定義
- 通常は他のレイヤーで実装される
- 明確な関心の分離を作成
- 依存性逆転を可能にする
特徴的な特性
- 頻繁な変更がない最も安定したレイヤー
- 他のすべてのレイヤーからアクセス可能
- 他のレイヤーへの依存関係を含まない
- 実装ではなく、ドメイン概念に純粋に焦点を当てている
- ValueObjectIDパターンを通じて強く型付けされた識別子を使用
Domain Layer(ドメイン層 / 領域層)
Domain Layerは、アプリケーションのドメインがどのように動作するかを定義するビジネスロジック、検証ルール、およびドメイン固有の振る舞いを実装します。
目的
Domain Layerはアプリケーションのビジネスロジックの中心として機能します:
- ビジネスルールと検証ロジックを実装
- ドメインオブジェクトがどのように相互作用し動作するかを定義
- 複雑なビジネスプロセスをカプセル化
- ドメイン不変条件と制約を強制
- ドメインモデルの整合性を保護
主要コンポーネント
-
Domain Services(ドメインサービス): 単一のエンティティに属さない操作を実装
- 複数のエンティティにまたがるビジネス操作に焦点を当てる
- 独自の状態を持たない
- エンティティでは捉えられないドメイン概念を表現
-
Validation Services(検証サービス): ドメインオブジェクトがビジネスルールを満たすことを確認
- 検証ロジックにのみ焦点を当てる
- 個々のエンティティまたは複雑なオブジェクトグラフを検証
- 例外をスローするのではなく検証結果を返す
-
Rule Services(ルールサービス): 動的なビジネスルールを実装
- ビジネスポリシーと決定ロジックをカプセル化
- ビジネス要件に基づいて構成可能
- ポリシー施行に焦点を当てる
-
Domain Events(ドメインイベント): ドメイン内での意味のある出来事を表現
- ドメインでの出来事の不変記録
- 過去形で命名される(例:
OrderPlaced
、UserRegistered
) - 関連するイベントデータを含む
- アーキテクチャ内でのリアクティブなパターンを可能にする
特徴的な特性
- ビジネスロジックを含むが、アプリケーションフローロジックは含まない
- 他のレイヤーではなく、Core Layerにのみ依存
- インフラストラクチャやUIの懸念事項なしの純粋なドメイン焦点
- 振る舞いを持つ豊かなドメインモデルを使用
- 直接的な外部依存関係を含まない
Orchestration Layer(オーケストレーション層 / オーケ層 / 指揮層)
Orchestration Layer(以前はApplication Layerと呼ばれていた)は、Prism Architectureの中央調整役として機能し、他のすべてのレイヤー間の操作の流れを管理します。
目的
Orchestration Layerはアプリケーションの中央調整者として機能します:
- レイヤー間のデータと制御の流れを調整
- 複数のドメイン概念にまたがる複雑な操作をオーケストレート
- 異なるレイヤーのニーズ間を変換
- ドメインイベントへのシステム全体の反応を管理
- Presentation Layerに一貫したAPIを提供
- Infrastructureサービスの適切な使用を指示
主要コンポーネント
-
Use Cases(ユースケース): 単一エンティティに対する特定の、焦点を絞った操作を実装
- 原子的な操作を処理
- 単一エンティティ操作に焦点を当てる
- 動詞-名詞の組み合わせで命名される(例:
RegisterUserUseCase
) - Domain、Infrastructure、Presentation Layerの間を調整
-
Orchestration Services(オーケストレーションサービス): 機能領域内の関連操作を管理
- 同じ集約内の複数のエンティティで操作できる
- 機能ドメイン内の複数のUse Caseを構成
- 機能ドメインにちなんで命名される(例:
AuthenticationOrcService
) - 必要に応じて機能固有のコンテキストを維持
-
Workflow Coordinators(ワークフローコーディネーター): 複雑な多段階プロセスを管理
- 異なる集約にまたがって動作できる
- 異なるドメインからのUse CaseとServiceの両方を構成
- 複数のステップや状態を持つ複雑なプロセスを処理
- プロセス全体での状態遷移を管理
-
Event Handlers(イベントハンドラー): Domain Eventsに応答
- Domain Layerからのイベントをサブスクライブ
- イベントへのシステム全体の応答を調整
- InfrastructureおよびPresentation Layerでの適切なアクションを指示
特徴的な特性
- すべてのレイヤー間の中央通信者として機能
- 複雑さによってコンポーネントを階層的に編成
- 最小限のビジネスロジックを含む(Domain Layerに委任)
- コマンドフローとイベントフローの両方を管理
- Presentation Layerのメインのを提供
Infrastructure Layer(インフラストラクチャ層 / インフラ層 / 基盤層)
Infrastructure Layerは外部通信、データアクセス、およびシステムサービスを処理し、アプリケーションに必要な技術的能力を提供します。
目的
Infrastructure Layerはアプリケーションの技術的基盤として機能します:
- データ永続化と取得メカニズムを実装
- 外部システムやAPIとの通信を提供
- システムレベルのサービスと機能を提供
- 横断的懸念事項の技術的側面を実装
- 上位レイヤーのニーズをサポート
主要コンポーネント
-
Repositories(リポジトリ): データアクセスと永続化を提供
- Core Layerのリポジトリプロトコルを実装
- データの保存と取得を処理
- トランザクションとデータ整合性を管理
- データソースの詳細をアプリケーションの残りの部分から抽象化
-
API Clients(APIクライアント): 外部サービスと通信
- HTTPリクエストとレスポンスを処理
- 外部システムとの認証を管理
- 外部通信用のデータをフォーマット
- 接続の問題と再試行ロジックを処理
-
Query Services(クエリサービス): 複雑なクエリのためのデータ取得を最適化
- 集約境界を越えた最適化されたデータアクセスを提供
- GraphQLやその他のクエリパターンをサポート
- ドメイン整合性とクエリパフォーマンスのバランスを取る
-
System Services(システムサービス): プラットフォーム機能とインターフェース
- デバイス機能とシステムAPIにアクセス
- ファイルシステム操作を提供
- ハードウェア相互作用を管理
- プラットフォーム固有の機能を提供
特徴的な特性
- ビジネス概念ではなく技術的実装に焦点を当てる
- Core Layerで定義されたインターフェースを実装
- 外部システムやサービスのアダプターを含む
- GraphQL最適化データアクセスパターンを提供
- 外部技術的懸念をアプリケーションの残りの部分から分離
Presentation Layer(プレゼンテーション層 / プレゼン層 / 画面層)
Presentation Layerは、ユーザーに情報を表示し、ユーザー入力をキャプチャする責任を持ち、ユーザーとアプリケーション間のインターフェースを提供します。
目的
Presentation Layerはアプリケーションのユーザー相互作用ポイントとして機能します:
- アプリケーションデータをユーザーフレンドリーな形式で表示
- ユーザー入力をキャプチャして検証
- ユーザーアクションをアプリケーション操作に変換
- UI状態と遷移を管理
- 応答性の高い直感的なユーザーエクスペリエンスを提供
主要コンポーネント
-
UI Components(UIコンポーネント): ユーザーインターフェースの視覚的要素
- 直接的なユーザー相互作用を処理
- 内部の視覚的状態を管理
- 再利用可能なインターフェース要素を提供
-
Presenters/ViewModels(プレゼンター/ビューモデル): UIとアプリケーション間の仲介者
- ドメインデータをプレゼンテーション準備形式に変換
- UI固有のロジックと状態を処理
- ユーザー相互作用に反応
- Orchestration Layerと通信
-
Screens(画面): 特定の機能のための完全なユーザーインターフェース
- 複数のUIコンポーネントを構成
- レイアウトとナビゲーションを定義
- UIコンポーネントをプレゼンターに接続
-
Navigation Controllers(ナビゲーションコントローラー): 画面間の遷移を管理
- 画面遷移とアニメーションを処理
- ナビゲーション状態を管理
- ディープリンクと外部ナビゲーションを調整
-
UI State Management(UI状態管理): UI状態の保存と更新を処理
- UI状態をドメイン状態とは別に維持
- 適切な場合、元に戻す/やり直し機能をサポート
- 一時的なUI状態(読み込み中、エラーなど)を管理
特徴的な特性
- PrismUIは3レベルの階層的プレゼンター構造に従う
- Top-Levelプレゼンターは直接Orchestration Layerにアクセスする
- Top-LevelプレゼンターのみがOrchestration Layerと通信できる
- 異なるUIパターン(PrismUI、MVVM、TCA、MVP)をサポート
- 状態を下に、Intentを上に向かわせる単方向データフローに従う
Common Layer(コモン層 / 共通層)
Common Layerは、アプリケーションの複数のレイヤーで必要な横断的ユーティリティ、データ転送オブジェクト、および共有機能を収容します。
目的
Common Layerは共有ユーティリティとデータ転送ハブとして機能します:
- レイヤー間の通信のためのデータ転送オブジェクト(DTO)を提供
- アプリケーション全体で使用されるユーティリティ関数とヘルパークラスを収容
- ドメイン固有でない共通列挙型を定義
- 複雑なオブジェクト作成のためのクロスレイヤーファクトリーをサポート
- 検証やフォーマットなどの一般的なタスクのためのツールを提供
主要コンポーネント
-
Data Transfer Objects(データ転送オブジェクト、DTO): データ転送のための軽量オブジェクト
- 最小限の振る舞いを持つシンプルなデータコンテナ
- ドメインロジックではなくデータ転送用に最適化
- 特定の通信ニーズに合わせたもの
- 通常は変更可能でシリアライズ可能
-
Display Objects(表示オブジェクト): UI表示のための特殊なDTO
- プレゼンテーション準備済みのデータを含む
- UI固有の属性を含む
- 複数のドメインエンティティからのデータを組み合わせることがある
- レンダリング効率のために最適化
-
Utilities(ユーティリティ): レイヤー間で必要な共通機能
- 状態を持たない、再利用可能な関数
- 特定のドメイン概念に結びついていない
- ビジネスロジックよりも技術的懸念に焦点を当てる
-
Cross-Layer Factories(クロスレイヤーファクトリー): レイヤーをまたがる複雑なオブジェクトを作成
- 複数のソースから構成されたオブジェクトを作成
- 特定のレイヤーに属さないオブジェクト作成を処理
- 標準化されたテストオブジェクトでテストをサポート
-
Common Enumerations(共通列挙型): ドメイン固有でない列挙型
- 複数のレイヤーで使用される固定値セットを表現
- しばしば技術的または実装上の懸念に関連する
特徴的な特性
- Infrastructure、Orchestration、Presentation Layerからアクセス可能
- Domain Layerからはアクセスされない
- 技術的、横断的懸念を含む
- ドメインエンティティとDTOの間に明確な分離を提供
- Core Layerよりも変動しやすく、他のレイヤーよりも安定している
オプションの拡張レイヤー
エンタープライズまたは大規模アプリケーションの場合、Prism Architectureには追加の特殊レイヤーを含めることができます。
Security Layer(セキュリティ層 / 保護層)
- 目的: 認証、認可、およびセキュリティの懸念事項を集中管理
- コンポーネント: Authentication Services、Authorization Services、Encryption Services、Security Policies
- 特性: アイデンティティプロバイダーとインターフェース、Orchestration Layerと通信
- 主要概念: 複数のセキュリティコントロールレイヤーによる深層防御を実装
Configuration Layer(コンフィグレーション層 / 設定層)
- 目的: 環境固有の設定と機能トグルを管理
- コンポーネント: Configuration Management、Environment Management、Feature Flag Management
- 特性: 環境間での異なる振る舞いを可能にする
- 主要概念: 機能フラッグにより新機能の制御された展開が可能になる
レイヤーの責任の比較
Core vs. Domain
- Core Layer: モノが何であるか(エンティティ、値オブジェクト)を定義する
- Domain Layer: モノがどのように振る舞い、相互作用するかを定義する
Domain vs. Orchestration
- Domain Layer: ビジネスルールとロジック(「何か」と「なぜか」)を含む
- Orchestration Layer: アプリケーションフローと調整(「いつ」と「どこで」)を制御する
Orchestration vs. Presentation
- Orchestration Layer: アプリケーション操作とワークフローを処理する
- Presentation Layer: ユーザーインターフェースと相互作用を管理する
Infrastructure vs. Common
- Infrastructure Layer: 技術サービスと外部インターフェースを実装する
- Common Layer: 共有ユーティリティとデータ転送オブジェクトを提供する
レイヤーアクセスルール
Prism Architectureは、レイヤーが互いにアクセスする方法について特定のルールを定義しています:
- Core Layerは他のすべてのレイヤーからアクセスできる
- Domain LayerはCore Layerにのみアクセスできる
- Orchestration LayerはCore、Domain、Infrastructure、およびCommon Layerにアクセスできる
- Presentation LayerはCore、Orchestration、およびCommon Layerにアクセスできる
- Infrastructure LayerはCoreおよびCommon Layerにアクセスできる
- Common LayerはCore Layerにのみアクセスできる
結論
Prismのレイヤードアーキテクチャは、実用的なデータフローを維持しながら、明確な関心の分離を作り出します。各レイヤーには明確な責任と境界があり、より保守性が高くテスト可能なコードが可能になります。これらのレイヤー定義を理解することで、Prism Architectureを効果的に実装するための基盤が提供されます。