ドメインオブジェクト、POCO、エンティティの違いは何ですか?


83

基本的には同じだという印象を受けました。モデルオブジェクトも同じですか?

現在、私のアーキテクチャでは、次のことがあります。

class Person 
{

    public string PersonId;        
    public string Name;
    public string Email;

    public static bool IsValidName() { /* logic here */ }
    public static bool IsValidEmail() { /* logic here */ }
}


class PersonService
{
    private PersonRepository pRepository;

    PersonService()
    {
        pRepository = new PersonRepository();
    }

    public bool IsExistingEmail(string email)
    {
        //calls repo method to see if email is in db
    }


    public Person GetPerson(email)
    {
        return pRepository.Get(email);
    }


    public void SavePerson(Person p)
    {
        if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email)
        {
            pRepository.Save(p);
        }
    }

}


class PersonRepository
{
    public void Save(Person p)
    {
        //save to db
    }

    public Person Get(string email)
    {
        //get from db
    }

    public bool IsExistingEmail(string email)
    {
        //see if email in db
    }

}

したがって、上記のクラスのどれありPOCODomain ObjectModel objectentity

回答:


117

私の(非標準の)レイマンの定義

  • POCO-プレーンな古い%Insert_Your_Language%オブジェクト。ロジックが含まれていないタイプ。データをメモリに保存するだけです。通常、自動プロパティだけが表示され、フィールドやコンストラクターが表示されることもあります。
  • Domain objectドメインに関連するクラスのインスタンス。私はおそらく、衛星オブジェクトまたはユーティリティオブジェクトをドメインオブジェクトから除外します。たとえば、ほとんどの場合、ドメインオブジェクトには、ログ、シリアル化、フォーマット、または暗号化する製品を特別に構築している場合を除き、ロギング、フォーマット、シリアル化、暗号化などは含まれません。 。
  • Model objectと同じだと思いますDomain object。人々はこれを同じ意味で使用する傾向があります(私は間違っている可能性があります)
  • Entity を持っているクラス id
  • Repository一方の側からデータストレージ(データベース、データサービス、ORMなど)と、サービス、UI、ビジネスレイヤー、またはその他の要求機関と通信するクラス。通常、データ関連のもの(レプリケーション、接続プール、キー制約、トランザクションなど)をすべて隠し、データの操作を簡単にします。
  • Service通常はパブリックAPIを介していくつかの機能を提供するソフトウェア。レイヤーに応じて、たとえば、RESTfulな自己完結型コンテナー、または必要なタイプの特定のインスタンスを見つけることができるクラスにすることができます。

元の回答

これらは、主に(分散)ドメイン駆動設計で使用される用語です。それらは同じではありません。モデルオブジェクトという用語は、ドメインオブジェクトの同義語として使用できます

ドメインオブジェクト。ドメインの専門家にとって意味のある何かを表す、ビジネス固有の領域からのオブジェクト。ドメインオブジェクトは、主にエンティティと値オブジェクトによって表されます。一般的に言えば、ドメインレイヤーに存在するほとんどのオブジェクトはモデルに寄与し、ドメインオブジェクトです。

エンティティ。基本的にその属性ではなく、継続性とアイデンティティのスレッドによって定義されたオブジェクト。(それは意味しなければならない持っている同上

POCO。複雑なロジックのない単純なオブジェクト。通常、いくつかのプロパティがあり、ORMで、またはデータ転送オブジェクトとして使用されます。

class Person-エンティティとPOCO、このクラスのインスタンスはドメインオブジェクトです
class PersonService-サービス
class PersonRepository-リポジトリ


4
上記の私のコードサンプルを参照して、条件をどのように適用するかを教えてください。
jpshook 2011年

いい答えです。私はこれに答える準備ができていました、しかしそれはあなたの答えのコピーでしょう。エンティティオブジェクトと値オブジェクトに加えて、ドメインイベントなどもあることを追加できます。すべてのオブジェクトはドメインレイヤーに存在し、モデルに貢献しますがドメインオブジェクトです。
Magnus Backeus 2011年

1
POCOを特定する必要がない場合、ORMでPOCOをロードするにはどうすればよいですか。それは論理的ではありません!
パスカル

1
なぜこの露骨に虚偽の情報が最も賛成され受け入れられているのですか。POJOは、ロジックが含まれていないタイプではありません。実際、Martin Fowlerは、エンティティBeanと対比するためにPOJOという用語を具体的に作り出しました(「エンティティBeanを使用するのではなく、ビジネスロジックを通常のJavaオブジェクトにエンコードすることの多くの利点を指摘していました」)。martinfowler.com/bliki/POJO.html
このユーザーは

1
私のコメントが強く表現されている場合は申し訳ありませんが、この用語の造語者がPOJOを明示的にビジネスロジックを含むように定義した場合、あなたの個人的な経験は実際には重要ではありません。実際、彼はあなたの練習をアンチパターンと見なす貧血ドメインモデル(martinfowler.com/bliki/AnemicDomainModel.html)に分類し、代わりにPOJOを使用することをお勧めします。アンチパターンであるかどうかはこの定義の範囲外ですが、明確なことが1つあります。POJOはビジネスロジックのないオブジェクトを意味するものではありませ
このユーザー

19

基本的にそれは内部ロジックに帰着します

  1. ドメインオブジェクトには、検証などのための内部ドメインロジックがあります。
  2. モデルは基本的に軽いドメインオブジェクトであり、保持しているデータについては知っていますが、それがどのように使用されるかについては実際には何も知りません。
  3. エンティティはデータを保持し、データがどこから来たのか、どこに保存、更新されるのかなどの内部知識を持っています
  4. POCOはデータを保持しており、プロパティコレクション内のすべてのアイテムの合計値など、自分自身に関する内部知識を持っている場合があります。
  5. DTOはすべての中で最も単純なアイテムであり、データを保持するだけでロジックはありません

それらはすべて基本的に同じ目的で使用されます、それはあなたがそれらをどれだけ賢くしたいかです

コードサンプルによると、Personクラスはドメインオブジェクトまたはモデルであり、他の2つはサービスとリポジトリです。ドメインオブジェクト、Pocos、モデル、dtosなどはメッセージのように使用され、あるレイヤーから次のレイヤーに渡されます。PersonServiceのようなサービスクラスはアプリケーションのレイヤーであり、PersonRepositoryのようなリポジトリクラスと同じです。全体像については、http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.htmlをご覧ください。この場合は、使用について説明しています。基本的にdtoであるデータエンティティ


18

それは機能の意味合いです。ドメインオブジェクトは、ロジック実装に固有のものであり、単純なPOCOよりも複雑な場合があります。エンティティには何かを表す意味合いがあり(通常は永続性メディアを参照)、POCOはクラスの単なる簡単な識別子です。モデルは、オブジェクトを表すために使用される単なる用語です(通常は状態を含み、通常はUIまたはDBを扱います)。

機能的な違いがあるわけではありません。それらは、何かをより厳密に説明するための単なる異なる用語です。レースカー、トラック、ファミリーセダンの違いのように。すべて自動車ですが、各用語はより説明的です。


コードサンプルを含めるように更新しましたが、コメントしていただけますか?質問するときは、正しい用語を使用していることを確認したいだけです。
jpshook 2011年

11

上記の回答には、ドメインとモデルの適切な説明がすでにあります。

データベースコンテキストエンティティでは、エンティティ関係モデルERDのアイテムを意味しますます。(つまり、テーブルの行)

では、マイクロソフト-DOTNET-EntityFramework世界エンティティからロードされたデータ(ベース)コンテキストを使用してデータベースに保存することができ、オブジェクトを意味します。通常、エンティティはそのData(Base)Contextなしでは存在できません。(ユニット-)これらのクラスのビジネス機能のテストは困難です。

Pocos(プレーンな古いCommonRuntimeオブジェクト)は、PersistenceFramework(EntityFrameworkまたはNHibernate)がなくても存在できるため、テストがはるかに簡単です。

pocoという単語は、同じ理由でJavaの世界で作成されたpojo (プレーンオールドJavaオブジェクト)を応用したものです。


反対票を投じる理由は何ですか?質問は、「ドメインオブジェクト、POCO、エンティティの違いは何ですか?」でした。エンティティとポコの違いを説明しました
k3b

「上記の回答には、ドメインとモデルの適切な説明がすでにあります。」他の回答に依存する回答を有効な回答として選択するにはどうすればよいですか?
jpshook 2011年

np。振り返ってみると、私はあなたに完全な答えを提供するように頼んでコメントするべきでした。次回は2倍考えます。
jpshook 2011年

3

ドメインオブジェクトは、アプリケーションのドメインレイヤー内のエンティティです。Addressクラス。「モデル」は同じことを意味します-「ドメインモデル」のエンティティ。

POCO(プレーンオールドCLRオブジェクト)は、動作(メソッド)が定義されておらず、データ(プロパティ)のみが含まれているオブジェクトです。POCOは通常、レイヤー間でデータを伝送するためのDTO(データトランスポートオブジェクト)として使用され、データはドメインオブジェクト/エンティティにデータを入力するために一般的に使用されます。


POCOをエンティティにすることはできませんか?POCOは動作する可能性があると思いましたが、永続性を知らない必要がありますか?
jpshook 2011年

@Developrええ、あなたのドメインモデル/エンティティは確かにPOCOのものである可能性があります-これは「貧血」ドメインモデルとして知られているものです-martinfowler.com/bliki/AnemicDomainModel.htmlを
MattDavey

この貧血をどのように考えますか?「リッチドメインオブジェクト」をどのように定義しますか?ドメインオブジェクトがデータベースと直接または間接的に対話できない場合、どのような豊富な機能を使用できますか?
jpshook 2011年

@Developr従来のPOCOクラスには豊富な機能がなく、データだけなので、POCOオブジェクトで構成されるドメインモデルは貧血だと思います。関心の分離の原則(en.wikipedia.org/wiki/Separation_of_concerns)に従って、ドメインモデル内のオブジェクトは、データベースアクセスにまったく関係しないはずです(したがって、一般的な用語「永続性の無知」)。ドメインモデルのエンティティが持つべき機能の種類はビジネスロジックです。それらは、それらが表す問題/ドメインの論理ルールとワークフローをキャプチャしてカプセル化する必要があります。
MattDavey 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.