web-dev-qa-db-ja.com

純粋なPOCOモデルを使用する利点は何ですか?

純粋なPOCOモデルを使用する主な利点は何ですか?モデルはクリーンでシンプルである必要がありますが、モデルクラス内で子オブジェクトのメンテナンスを維持する傾向があります。たとえば、ClassAClassBを次のように定義したとします。

public class ClassA
{
    public string MyProp { get; set; }
    public IEnumerable<ClassB> Children { get; }

    public void AddChild(ClassB newChild) { /*... */ }
    public void RemoveChild(ClassB child) { /* ... */ }
}

public class ClassB
{
    public string SomeProp { get; set; }
} 

Addメソッドとremoveメソッドを使用することで本質的に何か問題がありますか?代わりに、リストを公開して、クライアントコードがnullではなく、別のクラスに複製しないなどの単純なデータ検証の責任を渡すものを追加できるようにする必要がありますか?

どんな助けでもありがたいです。ありがとう。

16
Jesse

あなたの2つの質問は無関係です。

純粋なPOCOモデルを使用する利点は何ですか?

純粋なPOCOは、企業向けのフレームワーク、規則、[]に依存しておらず、同様に依存しているオブジェクトに密接に接続されていません。言い換えれば、世界はPOCOの周りで完全に変化する可能性があり、気にせずにそれが行うことを続けるだけです。フレームワークを更新したり、新しいシステムに移動したり、面白いものに見たりして、それを壊すことはできません。機能し続けるだけです。唯一の依存関係は、それが明示的に要求するものです。

POCOはPOJOのアイデアに他なりません。 JがCに変更されたのは、Javaという名前の概念がC#を使用している場合、その概念を説明するときに人々があなたをおかしく見ているためです。アイデアは言語に依存していません。単にそれをPlain Old Objectsと呼んでいますが、POOの使用を自慢したいのは誰ですか?

私はファウラーに起源を説明させます:

この用語は、2000年9月の会議でのレベッカパーソンズ、ジョシュマッケンジー、および私が講演の準備をしているときに作成されました。この講演では、ビジネスロジックを通常のJavaにエンコードすることの多くの利点を指摘しました。 Entity Beansを使用するのではなく、オブジェクトです。なぜシステムで通常のオブジェクトを使用することに反対するのか疑問に思い、単純なオブジェクトには派手な名前が欠けていたためだと結論付けました。

martinfowler.com:POJO

あなたの他の質問については:

Addメソッドとremoveメソッドを使用することで本質的に何か問題がありますか?

ABを直接知りたくない。しかし、これは [〜#〜] dip [〜#〜] のことではなく、 [〜#〜] pojo [〜#〜] のことではありません。

44
candied_orange

追加と削除を使用すると、Collection<T>機能を実装できます。 IEnumerable<T>または他の可変クラスの代わりにList<T>を使用する理由を自問してみてください。コレクションが読み取り専用であるべきだからではないようです。

私が考えることができる唯一の理由は、公開したいアクセス方法を制御したいということです。その場合は、独自のコレクションクラスを作成し、リストをカプセル化し、選択メソッドAddおよびRemoveを実装してIEnumerable<T>を実装する方が適切です。次に、子コレクションのタイプにIEnumerable<T>の代わりにそれを使用します。

しかし、私にはList<ClassB>がおそらくあなたのために役立つだけのようです。

3
Martin Maat

AddChildは何に追加され、RemoveChildは何から削除されますか?それがデータベース(または、あらゆる種類の永続ストア)からのものである場合は、アクティブレコードが得られます。必ずしも必ずしも悪いことではありませんが、@ CandiedOrangeが言及しているように、フレームワーク、規則、依存関係などについて心配する必要が確実に近くなります。

同時に、それらがすべて同じアプリケーション内にある場合、ClassAからClassB(または少なくともInterfaceB)への依存を回避する意味は何でしょうか?アプリケーションがモデル化している実際のドメインでは、物事は互いに依存しています。実際のオブジェクトdoには、それらに「属している」他のオブジェクトのコレクションがあります。これらの関係をコードで表すことは完全に適切です。

それが少しでも複雑になる唯一の理由は、ClassBがClassAに関連付けられたり関連付けられなくなったりする方法を正確に管理する必要があるためです。したがって、実装する動作が少しあります。あなたはそれをクラス内に実装することができます(これは完全に「合法的」です https://stackoverflow.com/a/725365/44586 を参照してください)、または含む別の種類のクラスを持つことができますその行動。個々の状況に最も適した方法を実行してください。

いずれにせよ、POJO/POCOは実際には単なるOOPであり、飾られておらず、邪魔されていません。OOPの原則に従ってください。そうすれば、安全です。

0
John M Gant