質問

現在、別のチームから引き継がれたもののコードレビューを行っており、SRPとその貧血または豊富なドメインモデル(Martin Fowlerによって定義されている)を適用することに疑いがあります。リッチドメインモデルの概念は、プロパティを設定/取得できるだけでなく、より複雑なビジネスロジックを実行できるインテリジェントオブジェクトを持つことです。私はそれがどのようにSRPに収まるのかと思っていますか?

私のモデルクラスには、それらの小道具を公開し、その適切なものについていくつかの簡単な計算を提供できるいくつかのプロパティを持っているとします。次の要件は、このような私の制御下にないいくつかのストレージオブジェクトにこのオブジェクトデータを保存する可能性を持つことです。

class MyObject {
    // get set
    // parse sth

}

ストレージにメソッドを保存します

   storage.store(key, object);

myobjectにこのようなストアメソッドがある場合、SRPに違反しませんか

public void store(Storage storage) {
    storage.store('keyOne', fieldOne);
    storage.store('keyTwo', fieldTwo);
}

このオブジェクトのPOVから、その状態を保存できることは良い考えです。他の方法は、ここにある種のサービスを紹介し、これをそのように行うことです。

public StorageService {
    private Storage;
    // constructor here
    ....
    public void store(MyObject myobj);
}

この問題について読むことができるリンクを教えてもらえますか?ここで1つのスレッドを見つけましたが、それは私の質問に完全には答えません。

DDDでどのように解決されますか? DDDのモデルは定義上豊富であり、責任が多すぎると見なすことができます。

役に立ちましたか?

解決

豊富なドメインモデル(RDM)それを意味します 論理 モデルの管理 行動 ゲッター/セッターを使用してモデルをデータのように扱うのではなく、モデル内に属します。これはそうです いいえ 永続性、セキュリティ、GUIにモデルを表示する方法などを意味します。モデル内にある必要があります。

RDMとSRPは密接に関連しており、彼らは互いに矛盾しません。

SRP/RDMの違反:

Car {
   // possibly violates SRP
   storeInDatabase();  
   // smells like anemic domain model
   getEngineState();   
}

SRP/RDMに続いて:

// usings aspects to remove cross-cutting concerns from the model and follow SRP
@DatabaseSerializable 
Car {
   // rich domain model encapsulates engine state and exposes behavior
   drive();            
}

他のヒント

「DDDのモデルは定義上金持ちであり、責任が多すぎると見なすことができます」 DDDの単純な解釈です。常にあなたのモデルがどれだけ良いかに依存します。 DDDを使用して悪いモデルを作成できます(たとえば、あまりにも多くの応答性を持つオブジェクトを作成したり、貧血モデルを作成したりします)。 DDDとSRPは、リファクタリング、TDDなどと同様に、2つの優れたプラクティスもフォローしていますが、経験と判断(または他の人)で使用を補完する必要があります。すべてには長所と短所があります。練習を適用することについて独断的ではありません。

@Garrett Hall

「RDMとSRPが密接に関連している、彼らは互いに対立しない」というあなたの声明に多少反対しています。私の経験では、SRPが強調されていると、貧血ドメインモデルにつながります。 「いいえ、私たちは持続性をサポートすることはできません。 なし そして、貧血ドメインモデルを持っているだけです。

そして、RDMが強調されていない場合(それが私が陥る傾向/エラーです)、SRPは道端に完全に落ち、最終的にあなたのクラスは数百の方法を持ち、明らかに多くのことをしていることに気付きます。

RDMとSRPの両方が起こっている幸せな媒体であるバランスを見つける必要があります。そして、そのバランスを見つけることは困難であり、多くの場合、技術的な精通やルールよりも多くの腸の感覚や政治が必要です。

"汝自身を知れ"。あなたが私のようで、過度に複雑なクラスに向かう傾向があるなら、注意してください。そして、あなたにとってさえ複雑すぎる他の誰かのクラスを見ると、それは大きな赤い旗です。同様に、あなたがSRPについてかなり筋金入りであることを知っていて、あなたの基準でさえも貧血に見えるクラスを見ると、それは主要なコードの匂いです。

現在、ストレージに関するOPの質問に多少答えて、私は多くのことが安定、標準、抽象的なストレージのどれほど安定しているかに依存していると思います。ストレージが標準のXML、CSV、またはRDBの抽象化である場合、自分自身を保存する方法を知っているオブジェクトにまったく問題はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top