はじめに
前回のpart3では「コンテキストマップ」について紹介しました。
さて、part4ではアーキテクチャについて学びましょう。一つの記事でまとめて紹介すると読むのに疲れますし、理解もあやふやになってしまうおそれがあると思ったので記事をいくつかに分けることにしました。
全体を通して、様々な種類のアーキテクチャについて紹介するのでそれぞれを確実に理解していきましょう!
紹介するアーキテクチャの種類
part4全体で紹介するのは、以下のアーキテクチャです。
- レイヤ化アーキテクチャ
- ヘキサゴナルアーキテクチャ
- サービス指向アーキテクチャ(SOA)
- RESTfulシステム
- コマンドクエリ責務分離(CQRS)
- イベント駆動アーキテクチャ(パイプ&フィルタ、長期サーガ、イベントソージング)
DDDにおけるアーキテクチャ
まず前提として、DDDは特定の技術に依存していないため、自由にアーキテクチャを選択することができます。
レガシーシステム(古臭いシステム)が既にあったり、特定のプラットフォームやフレームワークを基盤として開発したりする場合はアーキテクチャを自由に選択できないこともしばしばあります。
ではどのように選ぶのかというと、「機能要求(ユースケース、ユーザーストーリー、ドメインモデルのシナリオなど)」と「品質要求(性能、エラー制御、リアルタイム性など)」です。アーキテクチャの選択はプロジェクト進行に関わる重要な要素となりうるので、慎重に選ぶようにしましょう。
DDDシステムにおけるアーキテクチャの変遷
大きな変化だけを取り上げると、レイヤ化アーキテクチャ→DIPに基づいたレイヤ化アーキテクチャ→ヘキサゴナルアーキテクチャとなったことです。それぞれについては後で詳しく説明します。
では、今回のもう一つのテーマである「レイヤ化アーキテクチャ」について学びましょう!
レイヤ化アーキテクチャとは
名前の通り、いくつかの層(レイヤ)に分割してシステムを構築するパターンのことです。ここで注意点として紹介されているのが、単にライブラリや名前空間を分割するのに加えて、各レイヤの依存関係を明確にして、適切な責務に沿って実装するという点です。
つまりは、「レイヤごとにファイルを分けるだけではなく、それぞれが互いにどんな関係にあるのかをはっきりさせて、それぞれの役割ごとにしっかり分けて実装しよう」ということです。
レイヤ化アーキテクチャでのDDD
では、DDDとレイヤ化アーキテクチャを組み合わせた場合の各レイヤの特徴を見ていきましょう。
- UI(ユーザーインターフェース)層
- ドメイン層のモデルを使うことも可能ですが、描画(画面表示)での使用のみにしておくようにしましょう。
ドメイン層とUI層をきれいに分割することで、UI層の影響でドメインモデル(設計に関わるモデル)が変わってしまうのを防ぎます。一体化していると、ドメインモデルがUI層に引きずられるなどの理由で変わってしまうことが実際に起こりえてしまいます。
また、可能であれば、ドメインがビュー(UI層)の影響を受けることを防ぐために「プレゼンテーションモデル」という別のデータ構造を作ります。
- アプリケーション層
- UI層から使用されます。ここには「アプリケーションサービス」が存在します。アプリケーションサービスは「ドメインサービス」と異なり、ドメインロジックを持ちません。あくまで操作やリクエストに応じて、適切なオブジェクトを呼び出すなどの業務を担当します。
これにより、独自のビジネスロジックを持たず、軽量でシンプルなものになっています。 - ドメイン層
- ユースケースやユーザーストーリー(そのシステムの内容がわかるもの)を実装します。ドメインモデルが提供され、「ファクトリ」か「集約」のコンストラクタにてインスタンスを生成します。
ファクトリ:ユビキタス言語を用いて集約をシンプルに生成する
集約:関連するものをひとつにまとめる単位ドメイン層には「ドメインサービス(業務ロジックの中でも特に、エンティティや集約の中だけではうまく処理できないもの)」が含まれ、ステートレスな(独立した)操作として、ドメインの操作を行います。また、イベント駆動の場合「ドメインイベント」を発行します。
- インフラストラクチャ層
- 「リポジトリ」を使用してデータが長期間利用できるよう保存するのを可能にします。
おわりに
今回はアーキテクチャ全体の内容を紹介し、1.の「レイヤ化アーキテクチャ」を紹介しました。前述したように、次回のpart4.1では「ヘキサゴナルアーキテクチャ」についてわかりやすく解説していきます。また、「DDDシステムにおけるアーキテクチャの変遷」のセクションでもあったように、ヘキサゴナルアーキテクチャの前段階であるDIPについても解説しようと思います。
では、最後までお読みいただきありがとうございました次回もよろしくお願いします。参考