5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RCC (立命館コンピュータークラブ)Advent Calendar 2024

Day 8

はじめてのDDD part4 ~アーキテクチャについて~

Last updated at Posted at 2024-12-07

はじめに

前回のpart3では「コンテキストマップ」について紹介しました。
さて、part4ではアーキテクチャについて学びましょう。一つの記事でまとめて紹介すると読むのに疲れますし、理解もあやふやになってしまうおそれがあると思ったので記事をいくつかに分けることにしました。
全体を通して、様々な種類のアーキテクチャについて紹介するのでそれぞれを確実に理解していきましょう!

紹介するアーキテクチャの種類

part4全体で紹介するのは、以下のアーキテクチャです。

  1. レイヤ化アーキテクチャ
  2. ヘキサゴナルアーキテクチャ
  3. サービス指向アーキテクチャ(SOA)
  4. RESTfulシステム
  5. コマンドクエリ責務分離(CQRS)
  6. イベント駆動アーキテクチャ(パイプ&フィルタ、長期サーガ、イベントソージング)
アーキテクチャ全体の内容を紹介したあと、1.の「レイヤ化アーキテクチャ」を紹介するまでを今回の記事(part4)にします。2.からはpart4.1のように、1つずつ紹介していこうと思います。

DDDにおけるアーキテクチャ

まず前提として、DDDは特定の技術に依存していないため、自由にアーキテクチャを選択することができます。

レガシーシステム(古臭いシステム)が既にあったり、特定のプラットフォームやフレームワークを基盤として開発したりする場合はアーキテクチャを自由に選択できないこともしばしばあります。

ではどのように選ぶのかというと、「機能要求(ユースケース、ユーザーストーリー、ドメインモデルのシナリオなど)」と「品質要求(性能、エラー制御、リアルタイム性など)」です。アーキテクチャの選択はプロジェクト進行に関わる重要な要素となりうるので、慎重に選ぶようにしましょう。

DDDシステムにおけるアーキテクチャの変遷

大きな変化だけを取り上げると、レイヤ化アーキテクチャDIPに基づいたレイヤ化アーキテクチャヘキサゴナルアーキテクチャとなったことです。それぞれについては後で詳しく説明します。
では、今回のもう一つのテーマである「レイヤ化アーキテクチャ」について学びましょう!

レイヤ化アーキテクチャとは

名前の通り、いくつかの層(レイヤ)に分割してシステムを構築するパターンのことです。ここで注意点として紹介されているのが、単にライブラリや名前空間を分割するのに加えて、各レイヤの依存関係を明確にして、適切な責務に沿って実装するという点です。
つまりは、「レイヤごとにファイルを分けるだけではなく、それぞれが互いにどんな関係にあるのかをはっきりさせて、それぞれの役割ごとにしっかり分けて実装しよう」ということです。

レイヤ化アーキテクチャでのDDD

では、DDDとレイヤ化アーキテクチャを組み合わせた場合の各レイヤの特徴を見ていきましょう。

UI(ユーザーインターフェース)層
ドメイン層のモデルを使うことも可能ですが、描画(画面表示)での使用のみにしておくようにしましょう。

ドメイン層とUI層をきれいに分割することで、UI層の影響でドメインモデル(設計に関わるモデル)が変わってしまうのを防ぎます。一体化していると、ドメインモデルがUI層に引きずられるなどの理由で変わってしまうことが実際に起こりえてしまいます。

また、可能であれば、ドメインがビュー(UI層)の影響を受けることを防ぐために「プレゼンテーションモデル」という別のデータ構造を作ります。

アプリケーション層
UI層から使用されます。ここには「アプリケーションサービス」が存在します。アプリケーションサービスは「ドメインサービス」と異なり、ドメインロジックを持ちません。あくまで操作やリクエストに応じて、適切なオブジェクトを呼び出すなどの業務を担当します。
これにより、独自のビジネスロジックを持たず、軽量でシンプルなものになっています。
ドメイン層
ユースケースやユーザーストーリー(そのシステムの内容がわかるもの)を実装します。ドメインモデルが提供され、「ファクトリ」か「集約」のコンストラクタにてインスタンスを生成します。

ファクトリ:ユビキタス言語を用いて集約をシンプルに生成する
集約:関連するものをひとつにまとめる単位

ドメイン層には「ドメインサービス(業務ロジックの中でも特に、エンティティや集約の中だけではうまく処理できないもの)」が含まれ、ステートレスな(独立した)操作として、ドメインの操作を行います。また、イベント駆動の場合「ドメインイベント」を発行します。

インフラストラクチャ層
 「リポジトリ」を使用してデータが長期間利用できるよう保存するのを可能にします。

おわりに

今回はアーキテクチャ全体の内容を紹介し、1.の「レイヤ化アーキテクチャ」を紹介しました。前述したように、次回のpart4.1では「ヘキサゴナルアーキテクチャ」についてわかりやすく解説していきます。また、「DDDシステムにおけるアーキテクチャの変遷」のセクションでもあったように、ヘキサゴナルアーキテクチャの前段階であるDIPについても解説しようと思います。
では、最後までお読みいただきありがとうございました次回もよろしくお願いします。

参考

「実践ドメイン駆動設計」から学ぶDDDの実装入門/青木 淳夫

実践DDD本 第4章「アーキテクチャ」 ~レイヤからヘキサゴナルへ~

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?