拡張回答:
誰もそんなことをしないと盲目的に言わずに、この状況を分析してみましょう。
DTO-データのみを含み、境界間でデータを転送する構造です。
ドメインモデル-ここでのキーワードは「モデル」です。これは、ドメインの問題を解決するためのドメインの抽象化です。オブジェクト指向の観点からは、それは単純なクラスです。それを分解すると、純粋なデータ(DTO)と、純粋なステートレスな動作(DDD用語でのサービスまたはドメインサービス)になります。
次に、MVVMパターン、特にVM部分を例にとってみましょう。ビューモデル-ここでもキーワードは「モデル」であり、問題を解決するビューの抽象化です。人々がそれを実装する方法はたくさんあります。ドメインオブジェクトをラップするもの、変換を行うもの、DTOをラップするものがあります。ここでのポイントは、ビューモデルはビューのドメインモデルであり、他のモデルとほとんど同じであるということです。では、なぜ人々はドメインモデルを実装する方法を制限するのでしょうか。
ここで、DTOとドメインモデルに戻ります。上で述べたように、ドメインオブジェクトをDTOとサービスに分解できます。ドメインオブジェクトをDTOの動作ラッパーと考えてみましょう(MVVMがよく行うように)。それが私たちを導くところ:
- まず、OOのカプセル化を解除します。オブジェクトデータが誤って使用されるのを防ぐため、これは悪いことです。誰かがドメインオブジェクトデータ(DTO)を直接操作して、モデルを無効な状態にする可能性があります。これは巨大です。
- オブジェクトスロー境界、Webサービス、シリアル化、クローン作成を簡単に転送でき、データパーツを切り離して、データストレージまたはWebサービスに渡すことができます。これは分散システムにとっては巨大です。
続けましょう、カプセル化を破ることは深刻な問題です。必要なのは、ドメインオブジェクトデータが直接操作されないことを保証する方法です。ドメインオブジェクトのみがデータを操作する必要があります。これは、ドメインオブジェクトの外部にある場合に、DTOを不変の読み取り専用オブジェクトにすることで実現できます。
次に、DTO、継承と構成の再利用について説明します。誰かが言った:継承よりも構成を好む、そして私は個人的にこのルールに従う。しかし、あなたはあなたの特定の状況を分析する必要があります。ルールは「優先する」と言っていますが、従わないでください。
元のAsnwer:
私は個人的にそのようなアプローチをあまり見たことがありませんでしたが、この方法は過小評価されており、潜在的に非常に良い可能性があると思います。
私はそのような質問が何度も聞かれるのを見ました、そしてすべての答えは、誰もそのようなことをしないのでこれをしないでください。実験することを恐れないでください。
ライアン・ベネットは彼の答えに次のように書いています。
今は簡単かもしれませんが、将来的にはメンテナンスの悪夢になるかもしれません。
確かにそうですが、将来がない場合や小さなプロジェクトの場合は、ここでYAGNI、TDD、アジャイルのルールを守り、最小限の作業でその仕事をします。
コードは石に刻印して決して触れないものではありません。必要なときにリファクタリングしてDTOを導入したり、オートマッパーなどを使用したりできます。