アーキテクチャ (IT)ソフトウェアアーキテクト

ドメイン駆動設計(DDD)とは何ですか?アーキテクチャのレベルでの主要な構成要素と、コンテキストの境界をどのように実現しますか?

Hintsage AIアシスタントで面接を突破

回答。

ドメイン駆動設計(DDD)は、ソフトウェアシステムの設計アプローチで、ドメインとそのロジックに焦点を当てます。DDDは、複雑なドメインを関連性のある独立したバウンデッドコンテキストに分割します。各コンテキストでは、ドメインエキスパートと合意された独自の言語(ユビキタス言語)が開発されます。DDDの主要な構成要素は以下の通りです:

  • エンティティ: ユニークなIDとライフサイクルを持つオブジェクト(例えば、注文)。
  • バリューオブジェクト: ユニークなIDを持たない不変のオブジェクト(例えば、配送先住所)。
  • アグリゲート&アグリゲートルート: すべての変更がアグリゲートのルートを通じて行われるオブジェクトの集合。
  • リポジトリ: アグリゲートストレージとの対話のための層。
  • サービス: 特定のオブジェクトに関連しない操作。

バウンデッドコンテキストは多くの場合、明示的に定義されたAPIまたはイベントを介して相互作用する独立したマイクロサービスを表します。

Java(Spring)でのコード例:

// バリューオブジェクトの例 @Embeddable public class Address { private String city; private String street; // ... コンストラクタ、equals、hashCode } // アグリゲートルートを持つエンティティの例 @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... ビジネスロジック }

主な特徴:

  • ドメインの明確な分解とロジックのコンテナ化。
  • 隔離による開発とスケーリングの簡素化。
  • チームの技術的およびビジネスの言語の整合性の向上。

トリック質問。

DDDのすべてのオブジェクトはエンティティですか?

いいえ、バリューオブジェクトも存在します。これらはユニーク性を持たず、その状態がアイデンティティを完全に定義します。

Address a1 = new Address("モスクワ", "アルバート"); Address a2 = new Address("モスクワ", "アルバート"); System.out.println(a1.equals(a2)); // true

マイクロサービスに分割することはDDDの適用を意味しますか?

いいえ、モノリシックアプリケーション内でもDDDを適用し、内部のコンテキストの境界を形成することができます。

各アグリゲートにリポジトリは常に必要ですか?

通常は必要ですが、アグリゲートが別のビジネストランザクションのルートでない場合、他のアグリゲートの一部として完全に保持できることもあります。