これはあなたの質問に正確に答えるものではありませんが、ドメイン駆動設計の反対はデータベース駆動設計だと思います。データベース駆動型設計では、最初にデータベーススキーマが作成され、次にスキーマがどのように見えるかを完全に理解した上でクラスが作成されます。利点は、「内部で」何が起こっているのかをよりよく理解し、インピーダンスの不一致の影響を最小限に抑えることです。ただし、欠点は、データベーススキーマがオブジェクト指向ではなくリレーショナルであるため、オブジェクトにあまり変換されないことです(たとえば、リレーショナルデータベースにはコレクションの概念がありません)。
ドメイン駆動設計では、理論的には、他のクラスと同じようにデータオブジェクトを作成し、データベースを単なる永続層として扱います。レイマンの用語では、データベースは単なるストレージコンテナであり、オブジェクトがどのように格納されるかは気にせず、何らかの方法で格納されるだけです。これにより、インピーダンスの不整合がなくなり、心配することが1つ少なくなります。ただし、実際には、オブジェクトがどのように格納されるかを認識しておく必要があり、使用しているORMが複雑なSQLクエリを吐き出そうとするとパフォーマンスの問題が発生する可能性があります。
編集:
原則として、ドメイン駆動設計がどのようなものであるかの例を次に示します。(C#で)次のようなPersonクラスがあるとします。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public ICollection<Person> Relatives { get; set; }
public Company Employer { get; set; }
}
さて、リレーショナルデータベースでは、これはおそらく3つのテーブル、Personテーブル、Addressテーブル、Companyテーブルに変換され、それらの間には多数の関係があります。ただし、これは、プログラマーがこのオブジェクトを見る方法とは大きく異なります。プログラマーは、これを4つのパラメーターを持つPersonオブジェクトのインスタンスと見なします。そのうちの1つはICollection
です。これはデータベーステーブルの構造とあまり一致しないため、「インピーダンスの不一致」、つまりレイメンの用語では、リレーショナルモデルとオブジェクトモデルのレイアウトの違いがあります。
ドメイン駆動設計では、これを実行できるはずです。
Person person = new Person();
// set each property to something
Database.Save(person);
これで、personオブジェクトが保存されます。私はそれを次のように取得できます:
Person databasePerson = Database.Get<Person>(idOfPerson);
そして、Person
保存する前と同じように、オブジェクトが返されます。このように、データベースがどのようにデータを保存しているか、またはインピーダンスの不一致について心配する必要はありません。保存して、必要に応じて取得します。
しかし、これはすべて理論上です。実際には、おそらく手動で「マッピング」を指定する必要があります。つまり、データを取得するデータベース内のテーブル/列をクラスがどのように認識するかを指定する必要があります。ディクショナリやその他のADTなどのより複雑なタイプにマップしようとしている場合や、複数のテーブルから1つのクラスにデータをプルしようとしている場合は、かなり複雑になる可能性があります。