DDD Start Chapter 1の概要


「オンライン書店」というソフトを開発するとします.

ドメイン

  • の開発者にとって、「オンライン書店」は実施対象となる.
  • ネット書店ソフトウェアは商品検索、購入、決済、配送追跡などの機能を提供しなければならない.
  • 「オンライン書店」は、ソフトウェアで解決すべき問題領域であるドメインに相当する.
  • 1つの
  • ドメインは、いくつかのサブドメインに分けることができる.
  • ドメインモデル


    これは
  • の特定のドメインに対する概念的な記述である.
  • これは
  • ドメイン自体の概念モデルを理解するためである.
  • ドメインモデル表現方法
  • オブジェクトを使用するドメインモデルは、機能およびデータのオブジェクトモデル(クラス図)
  • である.
  • 状態図
  • ドメインの理解に役立つ場合、表現は重要ではありません.
  • ドメインモデルモード


    [テーブル]アーキテクチャ構成
    レイヤ説明ユーザインタフェース(UI)ユーザの要求を処理し、ユーザに情報を表示する.ユーザは人間のみならず、外部システムもユーザであってもよい.アプリケーション・ユーザーが要求する機能を実行します.ビジネスロジックを直接実装するのではなく、ドメイン層を組み合わせて機能を実行します.ドメインシステムが提供するドメインのルールを実装します.インフラストラクチャ・データベースやメッセージング・システムなどの外部システムとの連動を処理します.
  • アーキテクチャ上のドメイン層は、オブジェクト向けの方法で実現されるモードである.
  • ドメイン層は、ドメインのコアルールを実施する.
  • コア・ルールを実装するコードはドメイン・モデルにのみ存在するため、ルールの変更または拡張時に他のコードへの影響を低減し、変更履歴をモデルに反映することができます.
  • エンティティと価値


    ドメインモデルは、エンティティと価値に分けられます.

    エンティティ

  • エンティティには一意の識別子があります.
  • 要素の識別子は一意であるため、2つの要素の識別子が同じであれば、2つの要素を同じとして表すことができる.エンティティクラスは識別子を使用してequals()メソッドとhashCode()メソッドを実装できます.
  • エンティティ識別子の作成

  • 特定の規則に従って
  • を生成する.
    作成
  • UUID
  • 直接入力
  • のシリアル番号(シーケンスまたはDBの自動増分列を使用)
  • を使用する.

    バリュー・タイプ

    public class ShippingInfo {
    	
        private String receiverName; // 개념적으로 받는 사람 정보
        private String receiverPhoneNumber; // 개념적으로 받는 사람 정보
    }
  • ShippingInfoクラスのReceiverNameフィールドとReceiverPhoneNumberフィールドには2つの異なるデータが含まれていますが、概念的には受信者を表します.
  • の2つのフィールドは、実際には概念を表しています.
  • Valueタイプは、概念的に完全な1つを表現するために使用される.
  • には、必ずしも2つ以上のデータが必要ではありません.
  • のもう1つの利点は、付加価値タイプに機能を追加することもできることです.
  • Valueオブジェクトのデータを変更する場合は、変更したデータを使用して新しいValueオブジェクトを作成する方法が優先されます.
  • エンティティ識別子

  • オーダー番号の場合、OrderNoではなくStringタイプを使用する場合、「id」という変数名のみを使用して、このフィールドがオーダー番号であるかどうかを判断できません.
  • フィールドの意味を表示するには、idフィールド名ではなくorderNoフィールド名を使用する必要があります.
  • とは対照的に、識別子にOrderNoタイプを作成すると、受注番号がタイプそのものであることがわかります.したがって、フィールド名が「id」であっても、実際の意味を見つけるのは難しくありません.
  • setメソッドをドメインモデルに入れない

  • setメソッドは、ドメインのコア概念または意図をコードから消滅させる.
  • CompletePayment()は支払い完了に関する処理コードとともに実装され,ドメイン知識をコードとして実装するのは自然である.
  • setメソッドは、ステータス値のみを変更するか、ステータス値に基づいて他の処理のためのコードを実装するかを決定しない.
  • ドメインオブジェクトを作成すると、不完全になる可能性があります.次のコードは発注者の設定を漏らしています.
  • // set메서드로로 데이터를 전달하도록 구현하면
    // 처음 order를 생성하는 시점에 order는 완전하지 않다.
    Order order = new Order();
    
    // set 메서드로 필요한 모든 값을 전달해야 함
    order.setOrderLine(lines);
    order.setShippingInfo(shippingInfo);
    
    // 주문자(Orderer)를 설정하지 않은 상태에서 주문 완료 처리
    order.setState(OrderState.PREPARING);
  • ドメインオブジェクトが不完全な状態になることを防止するには、ジェネレータを介して必要なすべてのデータを受信する必要があります.
  • Order order = new Order(orderer, lines, shippingInfo, OrderState.PREPARING);
  • ジェネレータは、ジェネレータを呼び出すときにデータが正しいかどうかを確認するために必要なすべての情報を受信する.