ソフトウェア開発の複雑さが増すにつれて、開発チームが直面する課題を過小評価することはできません。時間が迫っている場合でも、ニーズが変化している場合でも、開発者はプロジェクト開発プロセスをより効率的にするためのソリューションを見つける必要があります。現時点では、ドメイン駆動設計 (DDD) が広く支持される戦略となっています。
「中核分野に集中することは選択ではなく、必然です。」
ドメイン駆動設計の最も重要な概念は、ソフトウェア モデルをビジネス ドメインと効果的に結び付けることです。開発者は、その分野の専門家との綿密な対話を通じてビジネス ロジックを理解し、ユーザーのニーズを満たすだけでなく、継続的に保守できるソフトウェア システムを構築できます。このアプローチの鍵は、すべてを一度に解決しようとするのではなく、中核となる領域に焦点を当てることです。
ドメイン駆動設計を通じて、大規模なシステムをいくつかの「境界コンテキスト」に分割し、それぞれが独自の独立したモデルを持つことができます。このような分割により、開発チームは特定の機能領域に集中することができ、部門間の干渉が軽減されます。また、ビジネス専門家と開発者間の創造的なコラボレーションも促進され、概念モデルを繰り返し修正できるようになります。
「モデルの設計はビジネス ニーズに対応する必要があります。これがシステムの保守を容易にする鍵です。」
ドメイン駆動設計を使用するもう 1 つの利点は、統一言語の重要性が強調されることです。いわゆるユビキタス言語は、ビジネス専門家、ユーザー、開発者の間で一般的に使用される言語であり、すべての参加者がビジネス ニーズを明確に理解するのに役立ちます。全員が同じ文脈でコミュニケーションを行うからこそ、コミュニケーションエラーを効果的に削減し、プロジェクトの進行を促進することができます。
ただし、批評家は、DDD の実装には、モデルの純度と有用性の観点から、多くの分離とカプセル化の作業が必要であると指摘しています。これは、開発者がモデルの境界内で一貫性を常に維持する必要があり、将来の変更を追加の負担とみなす必要があることを意味します。特に小規模またはそれほど複雑ではないプロジェクトの場合、このアプローチは不必要なオーバーヘッドを引き起こす可能性があります。したがって、Microsoft は、複雑なドメインでのみ DDD を採用することを推奨しています。このモデルが共通のビジネス理解を明確に提供する場合に価値があります。
DDD は複数のモデルの存在を認識します。最も一般的なモデルには、エンティティ (Entity) と値オブジェクト (Value Object) が含まれます。エンティティはそのアイデンティティによって定義されるオブジェクトですが、値オブジェクトはそのプロパティによって定義され、概念的なアイデンティティはありません。たとえば、ほとんどの航空会社は、航空機の各座席に固有の番号を割り当てており、それが座席の ID となります。対照的に、人々は名刺を交換するとき、それぞれの名刺の独自性を区別することよりも、名刺に記載されている情報に注意を払います。
「さまざまなタイプのモデルを理解することは、DDD をマスターするための基礎です。」
DDD では、オブジェクトの作成プロセスがオブジェクト自体から分離されることがよくあります。たとえば、リポジトリは、データ ストア (データベースなど) からドメイン オブジェクトを取得するためのメソッドを備えたオブジェクトです。ファクトリ(Factory)は、ドメインオブジェクトを直接作成するために使用されるオブジェクトです。さらに、プログラムの一部の機能が概念的にはどのオブジェクトにも属さない場合、通常はサービスを通じて表現できます。
DDD では、イベントは多くの種類に分類できますが、その中で最も重要なものは「ドメイン イベント」と「統合イベント」です。ドメイン イベントは特定のビジネス ドメイン内での重要な出来事をマークしますが、統合イベントは、境界のある異なるコンテキスト間の変更を伝達するために使用されます。これら 2 つは、システム データの一貫性とビジネス ロジックの整合性を確保する上で重要な役割を果たします。
コンテキスト マッピングは、さまざまなドメインまたはサブドメインの境界を識別および定義するために重要です。これらのコンテキストがどのように相互作用し、どのように関連しているかを視覚化するのに役立ち、明確な境界を維持し、結合を軽減します。
ドメイン駆動設計は必ずしもオブジェクト指向のアプローチと連携しているわけではありませんが、実際にはこれらの手法の利点を補完します。従来のアーキテクチャとは異なり、DDD は特定の技術的なフレームワークではなく、ビジネスの動作に焦点を当てることを求めています。
イベント ストーミング (イベント ストーミング)、イベント ソーシング (イベント ソーシング)、または境界付きコンテキストをマイクロサービスにマッピングする (マイクロサービス) などの方法を使用するかどうかに関係なく、DDD は開発者がビジネス要件を理解して実装することを促進する一連のツールと方法を提供します。最終的には、中核分野に焦点を当てることで、プロジェクトの成功の可能性が高まるだけでなく、将来のメンテナンス コストも効果的に削減されます。そうした中で、コア領域に注力することで開発プロジェクトにどのような変化がもたらされるのか、ということも考え始めていますか?