LoginSignup
35
35

なぜ DDD(ドメイン駆動設計) を採用するのか

Last updated at Posted at 2023-08-05

この記事の背景

現職では DDD を採用しており、色々な方と DDD についてお話しする機会があります。

その中で、特に初学者の方はアーキテクチャに対して「なぜこんなに面倒な事をするのか?」という印象を持たれているようでした。

そこで、DDDを採用する目的について言語化してみました。
(個人の見解なので、誤りがあればぜひご指摘をmm)

対象読者

  • 基本的な用語は覚えた方
  • 見よう見まねで、ある程度コードも書いた方
  • 初心に立ち返って Why を理解したい方

DDDで実現したいこと

前提として、以下の要素を分けて考えます。

  • ビジネスルール
  • ビジネスルール以外の要素(例えばGUIやデータの保存など)

DDDでは ビジネスルールを反映したプログラムを重要なものと位置付けています。
なぜ重要なのでしょうか?

  • システムは何らかの課題を解決するために存在しています
  • 顧客のニーズの変化など、様々な要因で課題は変わっていきます
  • 課題の変化に合わせて、解決手段であるビジネスルールも変わっていきます
  • 課題の変更に対して素早く正確に対応できると、ビジネス(商売)としての競争力が高まります
  • ビジネスルールを反映したプログラムは、課題解決のための手段を最も直接的に表現している箇所です
  • 故に、これらのプログラムの品質を高めることが重要です

DDDで実現したい事を簡潔に言うと「ビジネスルールを反映したプログラムの品質を上げたい」となります。品質の上げ方としては、ビジネスルールを過不足なく反映することや、素早く安全に変更できる状態(保守性が高い状態)を維持すること等が挙げられます。

GUI=使い勝手もアプリケーションとしては勿論大事なのですが、相対的に見るとビジネスルールの方が大事という整理です。

DDDでは「ドメインエキスパート」「ユビキタス言語」「境界づけられたコンテキスト」など様々なワードが登場します。また、ソフトウェアアーキテクチャにおけるテクニックも色々と出てきます。これらはいずれも「目的達成のための手段の1つ」でしかないため、個別の手段に囚われて、目的を見失わないようにしましょう。

目的達成のための手段

メリットを感じるためには、手段についても理解を深める必要があります。
いくつか軽めに紹介します。

レイヤードアーキテクチャ

保守性を高めるための手段です。

プログラムの構造として、ビジネスルール以外の要素(=重要でないもの)を変更した際に、ビジネスルール(=重要なもの)への影響が出てしまう状態はよろしくありません。
例えば、ドメインモデル が DBにアクセスしてデータを取得するような構造の場合、テーブルのスキーマ変更を行うと、ドメインモデルまで修正する必要が出てしまいます。

依存性逆転の法則に沿って設計し、ビジネスルールに対してビジネスルール以外の要素が依存する構造にしましょう。

境界づけられたコンテキスト(Boundary Context)

保守性を高めるための手段です。

同じ言葉や物であっても、場面が異なる場合は別のものとして扱いましょう。
例えば、同じ「商品」であっても「注文する」時と「在庫管理する」時では、アクターも扱うデータも異なります。注文のアクターは顧客ですが、在庫管理のアクターは社員になります。商品の金額についても、注文する時は売値で在庫管理する時は原価、といった具合に関心事が異なります。これらを1つのモデルにまとめてしまうと、顧客向けの変更が社内業務に影響を与えてしまいます。

領域の区切り方は諸説ありますが、言葉に対する認識が揃う範囲で区切るのがよいかなと思います(アクターやチームなど)。

まとめ

  • DDDを採用する目的は「ビジネスルールを反映したプログラムの品質を上げたい」から
  • 手段を学ぶ際も、目的に立ち返ることが大事

参考文献

  • エリック・エヴァンスのドメイン駆動設計
35
35
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
35