DTO、POCO、および値オブジェクトの定義
まず、値オブジェクトについての小さなコメント。 C#には、Value Typeと呼ばれる同様の概念があります。 これは、オブジェクトをメモリに保存する方法の実装の詳細に過ぎず、これについては触れません。 説明する値オブジェクトは、DDD(ドメイン駆動設計)環境の概念です。
さあ、始めましょう。 DTO、Value Object、POCOなどの概念がしばしば同義的に使用されることに気づいたかもしれません。 しかし、それらは本当に同じことを意味するのでしょうか?
DTOは、データを操作するためのロジックのないデータを含むクラスです。 DTOは通常、異なるアプリケーション間、または単一のアプリケーション内のレイヤー間でデータを転送するために使用されます。 それらは情報のリポジトリと考えることができ、その唯一の目的はこの情報を受信者に転送することです。
一方、Value Objectはドメインモデルの完全なメンバーです。 エンティティと同じルールに従います。 値オブジェクトとエンティティの唯一の違いは、 値オブジェクトに独自のアイデンティティがないことです。 つまり、同じプロパティを持つ2つの値オブジェクトは同一と見なすことができますが、2つのエンティティは、プロパティが完全に一致する場合でも互いに異なります。
値オブジェクトにはロジックを含めることができ 、通常はアプリケーション間で情報を転送するために使用されません。
POCO(Plain Old CLR Object)は、POJOの類推として作成された用語です。 POJOの文字「J」は「Java」を意味するため、.NETでは使用できません。 POCOのセマンティクスはPOJOと同じです。
POJOは、Martin Fowlerによって、JavaBeansおよび2000年代初頭に普及した他の「重い」エンタープライズコンストラクトの代替として導入されました。
POJOの主な目標は、JavaBeansを使用せずにアプリケーションドメインを正常にモデル化できることを示すことでした。 さらに、JavaBeansはこの目的に使用しないでください。
.NET環境では、JavaBeansに直接類似するものはありません。 マイクロソフトはこれに似たものを想像したことはありませんが、類似点を見つけることができます。
System.ComponentModelのComponentクラスは、POCOの反対と考えることができます。 System.DataのDBCommandやSystem.DiagnosticsのEventLogなど、Componentを継承する.NETには多くのクラスがあります。
ほとんどの場合、コンポーネントからドメインクラスを継承することは意味がありません。 このソリューションは、モデルに不必要な複雑さをもたらします。 このような目的で.NET Frameworkのヘビーウェイトクラスを使用することは、 YAGNI原則に反します。
アンチPOCOアプローチのもう1つの良い例は、バージョン4.0より前のEntity Frameworkです。 EFによって生成された各クラスは、EntityObjectから継承し、EF固有のロジックをドメインに導入しました。 バージョン4以降、Entity FrameworkはPOCOモデルを操作する機能、つまりEntityObjectから継承されていないクラスを使用する機能を追加しました。
したがって、 POCOの概念は、サブジェクト領域のモデリングに可能な限り単純なクラスを使用することを意味します 。 この概念は、YAGNI、 KISS 、およびその他のベストプラクティスの原則に従うことに役立ちます。 POCOクラスにはロジックが含まれる場合があります 。
概念間の相関
これらの3つの概念の間には何かつながりがありますか? まず第一に、DTOと値オブジェクトは異なる概念を反映しており、相互に使用することはできません。 一方、POCOはDTOと値オブジェクトのスーパーセットです。
つまり、値オブジェクトとDTOはサードパーティのコンポーネントを継承しないため、POCOです。 同時に、POCOはより広い概念です。解決する問題に直接関係しないコンポーネントを継承しない場合、値オブジェクト、エンティティ、DTOまたはその他のクラスになります。
それぞれのプロパティは次のとおりです。
POCOクラスには独自のIDがある場合とない場合があることに注意してください。 値オブジェクトまたはエンティティのいずれかです。 また、POCO自体にロジックが含まれる場合と含まれない場合があります。 POCO DTOかどうかによります。
おわりに
上記は次のように要約できます。
- DTO!=値オブジェクト
- DTO⊂POCO
- 値オブジェクト⊂POCO
英語版の記事: DTO vs Value Object vs POCO