Create Branch

DDDやってみた

Published on 2025年1月30日

DDD

はじめに

今回はDDDのディレクトリ構成、ドメインモデリングを実装をイメージできるようになるために行いました。

この記事は思考整理と検証を目的にしているので、外部向け用の発信ではありませんので、ご了承ください。

解像度が荒い内容もあるので引き続き、検証しながら色々なライブラリを検証していく。
今回作成した題材を少しずつ実装していき、関数型DDDまで落とし込みしていく。

やったこと

  1. イベントストーミングによるワークフローの可視化
  2. スコープ可視化
  3. ドメインオブジェクトの洗い出し
  4. ドメインのルール・制約の洗い出し
  5. 実際の実装

実施内容については、この記事では詳しく説明しません。
各フェーズで実施されいてる内容は、こちらの記事を参照してください。

1. イベントストーミング

  • 題材:居酒屋
  • 詳細
    • 予約する
    • 席決める
    • コース決める
    • 人数確定
    • お店に来る
    • 店員を呼ぶ
    • メニューを見る
    • メニューを決める。
    • メニューを注文する。
    • 注文を追加する。
    • 注文金額を確認する。
    • お会計を頼む
    • お会計をする。

2. スコープの可視化

  • 想定するスコープ

    • 来店からお会計まで
  • 詳細

    • 店員

      • 席の時間を設定する
      • 席の指定する。
      • 席の管理する。
    • メニュー

      • 見る
      • 決める。
      • 注文する。
      • 注文を追加する。
    • 注文金額

      • 確認する
      • お会計する。

3. ドメインオブジェクトの洗い出し

  • 顧客
  • 店員
  • メニュー
  • 会計

4. ドメインのルール・制約の洗い出し

  • 注文
    • 席時間の30分前は注文できない。
  • お会計
    • 支払い方法
      • visa
      • 現金
      • paypay

5. 実際に実装してみた

自身の認識まとめ

  • Domain層
    • Entityディレクトリ
      • ConstorctorをPrivateで宣言して外部でインスタンスの生成をできないようにしている
      • この状態を作ることでこのコンストラクタを必ず通る状態にしている
    • valueObjectディレクト
      • Entityに属するプロパティに関するルール・制約を持たせている。
      • 業務ロジックがここに集約されていく。
    • Repoitoies ディレクトリ
      • ここはInfra層とドメイン層を繋ぐインターフェースを定義している。
      • Infraが直接Domain層にアクセスするのも強い依存が発生するため、interfaceを定義して抽象化している。
  • Infra層
    • 基本的には、データの操作を行う永続化層として定義している。
    • Mvcモデルだと オブジェクトモデル -> DBへアクセスする
      • この時にORMを用いている場合、オブジェクトモデルとORMを絡めて実装されるため、依存が強すぎる。
    • オニオンニオンアーキテクチャを採用することでi
      • infra層 -> domain層
      • infraからdomainを参照する形となるので、domain層は外部の状態に影響されない状態となるため、ドメイン層は業務知識を道立した状態となる。
      • domain層にアクセスする場合は、domain層のrepositoryを実装して、直接参照することを防ぐ
  • Usecase層
    • ここでは抽象度の高い実装となる。
    • 1. infra層で実装しているデータ操作必要な処理を参照する
    • 2. そのメソッドに対して、必要データを渡す。
  • presentaton層
    • ユーザーインターフェース(UI)を管理し、ユーザー入力を受け取る
    • ビュー(View)とコントローラ(Controller)で構成する
    • コントローラは、ユーザーのアクションを受け取り、usecase層で処理を呼び出して処理を実行する
hirotobeat