5

スマートオブジェクトによって、プロパティが変更された場合に元のプロパティ値を知っているドメインオブジェクトを考慮します。通常、スマート オブジェクトには基本クラスがあり、GetPropertyValue/SetPropertyValue メソッドを使用してプロパティを実装します。一方、POCO オブジェクトは通常、基本クラスを持たず、単純なプロパティを実装します。

public class SmartObject : BaseDomainObject
{
    public int id
    {
         get { return (int)this.GetPropertyValue("Id"); }
         set { this.SetPropertyValue("Id", value); }
    }
}

public class POCO
{
    public int id { get; set; }
}

私はスマート オブジェクトが好きです。これらの便利な機能をすべて BaseDomainObject に簡単に追加して、すべての派生ドメイン クラスに含めることができます。

  • 共通プロパティ (ID、ステータスなど)
  • オブジェクトの状態の追跡 (新規、変更済み、未変更)
  • すべてのプロパティは、プロパティの変更時にイベントを発生させます (INotifyProperyChanged の実装)
  • 派生クラスは自動的にシリアライズ可能になります (ただし、これが役立つことはめったにありません)。
  • クローン/同期/IsPropertyDirty...

一方、POCO は非常に単純で、どの基本クラスにも依存しません。

今日、私はここで多くのPOCOを賞賛しています。

  1. ネットワーク経由で送信できます (通常は JSON として Web ブラウザーに送信されます)。
  2. それは純粋です

一方、上記の理由は次の理由から誤謬であると思います。

  1. DTO は電信送金用であり、ドメイン オブジェクトではありません。ドメイン オブジェクトが JSON にシリアル化されたときに失われたデータをカプセル化する動作。
  2. この純度の追求は、ロジックもスマートなものも何も付いていない、さらに貧血なドメインモデルの追求のようなものです。

この悲しいことに、私はまだそのPOCOが好きで、私を悩ませています. あなたの意見は何ですか?

4

2 に答える 2

4
  • 共通プロパティ (ID、ステータスなど)

Id プロパティを定義する Entity 基本クラスなどを継承するだけのオブジェクトは、非 POCO とは見なしません。定義上、エンティティには ID があり、SRP を壊したり、サード パーティの動作をインポートしてオブジェクトの「純度」を変更したりしません。

ステータスは、それが実際にオブジェクトに追加の責任をもたらし、オブジェクトを非 POCO にする可能性があるという意味に応じて、より議論の余地があります。

あなたが言及した他のほとんどのプロパティは、ドメインオブジェクト自体ではなく、外部オブジェクトによって処理されるべきだと思います。

  • オブジェクトの状態の追跡 (新規、変更済み、未変更)

ドメイン オブジェクトの変更追跡に特化したプロキシでこれを処理する方がよいでしょう (これは通常、ORM が行うことです)。

  • すべてのプロパティは、プロパティの変更時にイベントを発生させます (INotifyProperyChanged の実装)

それは主に、プレゼンテーション オブジェクトには入るがドメイン オブジェクトには入らない UI 関連のものだと思います。おそらく、エンティティ内のすべてのプロパティを監視可能にする必要はありません。代わりに、Aggregate の変更を通知するには、Domain Events を使用してください。

  • クローン/同期/IsPropertyDirty...

通常、クローンは非 POCO と見なされることなく、値オブジェクトの基本的な動作になります。エンティティの複製は、時折ドメイン固有の必要性を除いて、私にはあまり役に立たないようです。Sync/IsPropertyDirty は、バージョン管理/変更追跡のように見え、特殊なオブジェクトに委任する必要があります。

この純度の追求は、ロジックもスマートなものも何も付いていない、さらに貧血なドメインモデルの追求のようなものです。

ここで問題となるのは、すべて「添付」に関するものです。SRP 準拠のオブジェクトがスマートでないということではなく、本来の責任ではないスマートなものが含まれていないということです。同様に、POCO は愚かではなく、外部ソース (サードパーティ ライブラリ、フレームワーク拡張など) からの動作が移植されていないオブジェクトにすぎません。

于 2013-07-26T10:08:40.523 に答える