はじめに
この記事では、
僕が現場でDDD取り入れた経験、
書籍・勉強会などを通じて学習した内容、
などを言語化して、
(僕が現時点で考えている)
DDDの実践前に抑えておきたいきほんをまとめました。
ポイント管理システムをテーマ作成した
DDD×クリーンアーキテクチャでのサンプルコードを
使いながら解説しています。
DDDで登場する設計テクニックをコードで学ぶ
まずはコードからDDDで登場する設計テクニックを学んでいきましょう。
今回テーマにしているポイント管理システムでは、
店舗からレシート情報とカード、ポイント利用などを連携され、
付与ポイントの加算、ポイント利用の減算などの
ポイント管理ができるシステムを想定しています。
ドメインモデルを表現するものたち
ポイント管理システムのコアになるドメインは
会員が保持するポイントの管理、
付与ポイント数の算出
などになるでしょう。
このドメインにおいて、
ソフトウェアで表現すべき重要な概念だけを抽出して
作成したドメインモデルは
エンティティと値オブジェクトというものを利用して表現します。
まずはこのエンティティと値オブジェクトは何か??
これらをコードでどのように表現するかを学びましょう!
詳細はこちらの記事をご覧ください。
コードで学ぶエンティティと値オブジェクト〜DDD実践のためのきほん〜ドメインオブジェクトを支えるものたち
DDDでソフトウェアを開発していると、
どうしても1つのエンティティや値オブジェクト
では表現しきれないケースが出てきます。
ファクトリー
エンティティなどのドメインオブジェクト生成手順が複雑で、
それ自体が立派な業務ロジックになることもあります。
この場合はドメインオブジェクト生成手順を
ファクトリーに切り出すことを検討しましょう。
詳細はこちらの記事をご覧ください。
コードで学ぶファクトリー〜DDD実践のためのきほん〜ドメインサービス
複数のドメインオブジェクトがなければ特定の判断ができない、
ドメインオブジェクトの集合に対して特定の判断を行いたい。
など、ドメインオブジェクトのメソッドにロジックを置くには、
不自然になることもあります。
この場合はドメインサービスに
業務ロジックを切り出すことを検討しましょう。
詳細はこちらの記事をご覧ください。
コードで学ぶドメインサービス〜DDD実践のためのきほん〜リポジトリ
ソフトウェアは何かしらの副作用を起こしながら、
特定の問題を解決していきます。
よくある副作用の1つにデータの永続化があります。
ドメインオブジェクトを永続化し、
後から再構築するためににはリポジトリを利用します。
詳細はこちらの記事をご覧ください。
コードで学ぶ集約とリポジトリの関係〜DDD実践のためのきほん〜ドメインオブジェクトを組み合わせてユースケースを実現させるもの
ドメインオブジェクトはそれ自体では、
課題解決はできません。
ドメインオブジェクトを組み合わせて、
1つのユースケースを実現させるための、
ユースケース(アプリケーションサービス)
が必要です。
詳細はこちらの記事をご覧ください。
コードで学ぶユースケース(アプリケーションサービス)〜DDD実践のためのきほん〜その他のものたち
DDDを実践していくと他にも
さまざまな課題が発生し、
必要に応じて対策する必要があります。
CQRS(Command Query Responsibility Segregation)
DDDで支払登録ユースケースに必要なドメインオブジェクトを用意し、
ポイント履歴一覧取得ユースケースでのモデルとしてもそれを使い回すと、
モデルの詰め替えが複雑だったり、
パフォーマンス問題の懸念などが発生します。
レシート番号 | ポイント取引履歴タイプ | ポイント数 |
---|---|---|
0000000001 | 付与 | 100 |
0000000002 | 付与 | 200 |
0000000002 | 利用 | 100 |
0000000003 | 付与 | 50 |
これらの課題に直面した場合には、CQRSの導入を検討します。
詳細はこちらの記事をご覧ください。
コードで学ぶCQRS〜DDD実践のためのきほん〜ドメインモデリングでドメインを抽象化する
DDDで登場する設計テクニックをコードを使った
コーディングができるようになったら、
ドメイン分析〜モデリング〜コーディング
を回しながら抽象化の練習と
モデルより良く洗練させる体験をしていきましょう。
まずは、松岡さんのSUDOモデリングを
実際に自分自身で体験しながらコツを掴むのがオススメです。
僕もまずは松岡さんの真似からスタートして、
現場のソフトウェアのコアドメインを同じように、
ドメインエキスパートと一緒にモデリングしながら
DDDを部分的に適応して保守性と機能性を向上させていきました。
ある程度複雑なドメインをテーマに
ドメインモデリングの練習ができるコンテンツ作成中です・・・
おまけ
僕がDDDについて学習を始めた頃の試行錯誤や気づき、
現場でDDDを取り入れる際の試行錯誤や挫折などを
記事や動画でまとめたので興味がある方は
是非ご覧ください。
ドメイン駆動設計のモデリング練習|データベーススペシャリストの過去問を題材に