はじめに
この記事では、
僕が現場でドメイン駆動設計を取り入れて成功や失敗した経験、
書籍や勉強会などを通じて学習した内容を基に、
ドメイン駆動設計から学んだ、
ソフトウェア開発をする際に非常に重要な考え方やテクニックをまとめました。
価値のあるソフトウェアを効率的に開発するためにドメイン駆動設計の考え方を学ぶ
ドメイン駆動設計は戦術的な設計テクニックだけでなく、
ドメイン駆動設計に登場する考え方を学ぶことで、
価値のあるソフトウェアを効率的に開発できると僕は考えています。
ソフトウェアを効率的に開発できていない現場の失敗体験談
まずは、
ソフトウェアを効率的に開発できていない現場での
僕の過去の失敗体験から見ていきたいと思います。
「ドメイン駆動設計をはじめよう」を読んで振り返る過去の失敗ドメイン駆動設計の考え方を
プロジェクトの関係者がいくつか理解して何かしらの形で適用できていれば、
このような失敗をせずに済んだのかもしれないと僕は考えています。
では、
どのような考え方を取り入れられれば良かったのか、
見ていきたいと思います。
事業活動とソフトウェア設計とを強く関連づける
記事作成中・・・
中核の業務領域を柔軟に成長させる
記事作成中・・・
同じ言葉を使って意図の伝達をスムーズに
記事作成中・・・
言葉の意味の境界を明確に区切る
記事作成中・・・
ドメイン駆動設計の戦術的な設計のテクニックをコードで学ぶ
まずはコードから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を部分的に適応して保守性と機能性を向上させていきました。
ある程度複雑なドメインをテーマに
ドメインモデリングの練習ができるコンテンツ作成中です・・・
おまけ
僕がドメイン駆動設計について学習を始めた頃の試行錯誤や気づき、
現場でドメイン駆動設計を実践する際の試行錯誤や挫折、
などなど記事や動画でまとめたので興味がある方は
是非ご覧ください。
ドメイン駆動設計のモデリング練習|データベーススペシャリストの過去問を題材に