ユーザーのニーズを満たすソフトウェアを開発するためには、高品質な設計が欠かせません。その実現にあたって、有力な設計手法が「ドメイン駆動設計(DDD)」です。
この記事では、ドメイン駆動設計とはどういったものなのか、概要を解説します。
また、ドメイン駆動設計の進め方や成功のポイントも紹介するので、ぜひ参考にしてみてください。
- もくじ
1.ドメイン駆動設計(DDD)とは
ドメイン駆動設計(DDD:Domain-Driven Design)とは、特定のドメイン(分野や領域)における知識やルール、要求をソフトウェアの設計に落とし込む手法です。ドメインの専門家から得た信頼性の高い情報にもとづき、ソフトウェアの設計を行います。
まずは、ドメイン駆動設計の概要を整理しておきましょう。
1-1 ドメイン駆動設計の概要
開発するソフトウェアは、必ず何らかのドメインに属します。例として、医療システムは「医療」というドメインに属しているでしょう。
ソフトウェアを設計する際、こうしたドメインに関する知識やルール、要求の把握が欠かせません。
たとえば勤怠管理システムを開発する場合、「出退勤」「シフト管理」といったドメイン知識が不可欠です。また、「労働基準法に準拠しなければならない」といったドメインルールも知っておかなければなりません。
このようなドメインの情報に不足・誤認があると、前提をはき違えたソフトウェアが完成する可能性が高くなります。
こうした問題を防ぐために、「ドメイン」と「ソフトウェア」を正しく紐づけるのがドメイン駆動設計です。
前述した勤怠管理システムの例では、労務管理や人事のエキスパートから正確なドメインの情報を抽出し、それに沿ってソフトウェアを設計します。
1-2 ドメインモデルとは
ドメイン駆動設計では、ドメインの情報を「ドメインモデル」という形に落とし込みます。ドメインモデルとは、ドメインに関する知識やルール、要求を抽象的に整理したものです。
ドメインモデルは主に次の3要素で構成されます。
要素 | 概要 | 具体例 |
---|---|---|
① エンティティ | ドメインの主役、実体となるもの。 IDで個々を識別する。 |
従業員 シフト |
② 値オブジェクト | 何らかの「値」を持つ属性や性質。 1つの値の意味自体は変えられない。 |
氏名 出勤時間 |
③ ドメインサービス | 上記以外のビジネスロジック。 複数要素間のやり取りも担う。 |
法定労働時間チェック 残業時間集計 |
これら要素を組み合わせて、ドメインをソフトウェア設計に落とし込みます。
オブジェクト指向やデータベースなどに関して知識を持つ人であれば、聞き覚えのあるワードが多いでしょう。
反対に、こうした前提知識がないと理解が難しい部分もあります。
2.ドメイン駆動設計を取り入れるメリット
ドメイン駆動設計には大きなメリットがあり、大手IT企業でも採用されています。ドメイン駆動設計を取り入れる主なメリットは、次の3つです。
2-1 ビジネス要件とソフトウェアの不整合を防げる
ドメイン駆動設計を取り入れることで、ビジネス要件とソフトウェアの不整合を防げます。
ビジネス要件とは、ビジネス(業務)の目的を達成するために、ソフトウェアが満たすべき条件のことです。たとえば勤怠管理システムには、「出退勤時間を正確に記録・集計できること」といったビジネス要件があります。
開発者はプログラム目線で考えやすく、本来のビジネス要件を見失うケースも少なくありません。
その点ドメイン駆動設計では、各ドメインの専門家と開発者が連携しながら、ドメインを設計へ落とし込みます。ビジネス要件を正確に固めてから設計するため、ビジネス要件に合わないソフトウェアが開発される事態を防げるでしょう。
2-2 トレーサビリティを確保しやすい
ドメイン駆動設計を取り入れると、トレーサビリティ(追跡しやすさ)を確保しやすくなります。
ドメイン駆動設計では、プログラム要素の名称はビジネス要件に合わせることが一般的です。そのため、要件と実装や設計の関連性を容易に把握できます。
どのプログラム要素が、どのビジネス要件をカバーしているのかわかりやすくなり、トレーサビリティの確保につながるでしょう。
プログラム変更時の影響範囲を把握しやすくなるなど、さまざまなメリットを得られます。
2-3 オブジェクト指向言語と相性がよい
ドメイン駆動設計は「オブジェクト指向」と相性がよいといえます。オブジェクト指向とは、モノの特徴や機能・動作をテンプレート化した「クラス」から実体(オブジェクト)を作り、それらを組み合わせてプログラムを作る考え方です。
ドメイン駆動設計のドメインモデルは、オブジェクト指向のクラスに落とし込むことが可能です。オブジェクト指向は多くの開発言語に採用されているため、幅広い開発現場でドメイン駆動設計を適用できるでしょう。
ただし裏を返せば、オブジェクト指向の基本を知らないと、ドメイン駆動設計の理解は難しくなります。
3.ドメイン駆動設計でのアプリ開発における主な要素
ドメイン駆動設計を採用したアプリ開発では、設計段階で考慮すべき3つの要素(リポジトリ・ファクトリ・アプリケーションサービス)があります。
いずれもドメインモデルを利用するものです。ここでは、オブジェクト指向の基本を把握している人に向けて、これら3つの要素について解説します。
3-1 リポジトリ
「リポジトリ」は直訳すると「倉庫」です。
つまり、ソフトウェアのデータを保管・管理する倉庫のような役割を担います。
具体的には、データベースなどのデータ源に直接アクセスし、データの保存や取得を行うものです。たとえば「新しい従業員データを登録するメソッド」は、リポジトリといえます。
3-2 ファクトリ
「ファクトリ」は直訳すると「工場」です。ドメインモデルからオブジェクトを生成する工場のような役割を担います。
オブジェクトの生成手続きが複雑な場合は、ファクトリによるカプセル化が便利です。
たとえば「従業員オブジェクトを生成するメソッド」をファクトリにすれば、生成前のデータチェックを内包できます。
3-3 アプリケーションサービス
「アプリケーションサービス」は、アプリのユースケースを実現する機能レベルのメソッドです。
具体的には、アプリのユーザーからUI経由で送られたリクエストを処理し、適切なドメインモデルを呼び出して手続きを行います。
前述したドメインサービスよりも上位の要素です。たとえば「登録ボタンが押された際に、従業員の登録手続きを行うメソッド」は、アプリケーションサービスといえます。
4.ドメイン駆動設計の大まかな進め方
ドメイン駆動設計は、一般的なソフトウェア開発とは異なる流れで進めていきます。ドメイン駆動設計の大まかな進め方は、次の5ステップです。
ステップ1 ドメインの調査・分析
まずは、開発対象のソフトウェアが属するドメインの調査・分析を行います。
ここでは専門家のサポートが欠かせません。ヒアリングや打ち合わせを行い、ドメインに関する理解を深めましょう。
ドメインに関する正しい理解がなければ、間違った方向性で設計も進むことになってしまいます。また、この段階でユースケース図といった要件定義レベルの成果物も作成しておくとよいでしょう。
ステップ2 共通言語(ユビキタス言語)の確立
次に、「共通言語(ユビキタス言語)」を確立します。
共通言語とは、関係者間で共通認識として使える用語の表現方法です。たとえば、「従業員」の表現方法は「employee」「worker」など複数あるでしょう。
各ドメイン用語に対して、どの表現方法を採用するかを決めておくのが共通言語です。
共通言語を確立すると、関係者間のやり取りがスムーズになるうえに、その後のモデリングや実装における表現のぶれも防げます。
ステップ3 モデリング(設計)
ドメインの調査結果や共通言語を踏まえてモデリング(設計)を行います。具体的には、オブジェクト指向に沿って前述したドメインモデルを作成することが一般的です。
ドメイン知識やドメインルールなどを、適切なクラスやメソッドに落とし込みましょう。
この時、「ドメインモデル図」と呼ばれる成果物を作成することも多いです。ドメインモデル図は、クラス図をより簡略化したイメージのもので、メソッドは記載しません。
ステップ4 モデルの最適化
次に、ドメインモデルに問題がないかチェックし、設計したモデルを最適化しましょう。具体的には複雑なモデルの分割や、冗長なモデルの共通化・簡素化などを行います。
たとえば、従業員登録用のリポジトリと承認者登録用のリポジトリを分割するか、共通化するかは判断が分かれるところでしょう。
何が最適であるかはケースバイケースのため、ビジネス要件や専門家の意見などを考慮しながら、理想形を追求することが大切です。
ステップ5 実装
最後は、完成したドメインモデルをもとにプログラムを実装します。実装の進め方はさまざまですが、プログラム的に下位レベルの要素から実装するとよいでしょう。
大まかには、次のような流れが理想です。
- エンティティ・値オブジェクトの実装
- ドメインサービスの実装
- リポジトリ・ファクトリの実装
- アプリケーションサービスの実装
設計にもとづき実装すること自体は、通常のソフトウェア開発と変わらないため同じように進めていきます。
5.ドメイン駆動設計を成功させるためのポイント
ドメイン駆動設計は一般的な開発の進め方と異なる部分が多く、失敗のリスクも少なからずあります。
ドメイン駆動設計を成功させるために、次のポイント3つを押さえておきましょう。
5-1 専門家と密なコミュニケーションを取る
前述のとおり、ドメイン駆動設計には、そのドメインに精通している専門家のサポートが欠かせません。
ドメインに関する正しい理解が不足したままプロセスを進めると、実態に即さないモデルが完成してしまいます。
専門家と密なコミュニケーションを取り、しっかり力を借りることが大切です。
5-2 モデルは継続的に改善を図る
ドメイン駆動設計で作成したモデルは、継続的に改善を図りましょう。
法改正やトレンド変化などの外部要因により、既存モデルに理想とのずれが生じる場合があります。
定期的にモデルの設計を見直すことで、ビジネス要件とソフトウェアの対応を維持できるでしょう。
5-3 ドメイン駆動設計への理解を深める
ドメイン駆動設計には、細かいノウハウが多数あります。ドメイン駆動設計に関する十分な知識がなければ成功にはつながりません。
適切なメンバー教育を行い、チームのドメイン駆動設計に対する理解を深めましょう。
まとめ
ドメイン駆動設計(DDD)とは、特定のドメイン(分野や領域)における知識やルール、要求をソフトウェアの設計に落とし込む手法です。
オブジェクト指向言語と相性がよく、ビジネス要件とソフトウェアの不整合を防げるなど、多くのメリットがあります。
ただし、ドメイン駆動設計には多くのノウハウが要求されるため、取り入れる際には十分な教育・事前準備が必要です。
ドメイン駆動設計を成功させたいとお考えの方は今回の内容をぜひ参考にしてみてください。
他の駆動開発について詳しくはこちらの記事をご覧ください。