私はいくつかの検索を行いましたが(おそらく私の問題を十分に説明していません)、これに対する答えを見つけることができませんでした
次のPOCOがあるとします。
public class StandardObject
{
public string A {get;set;}
public string B {get;set;}
}
プログラムの他の場所には、StandardObjectsを処理するためのロジックがあります。StandardObjectを別の方法で処理する必要がある場合があります。StandardObjectを作成するときにこれを知っていますが、現在のプロパティを使用して、チェーンのさらに下流でこれを決定することはできません。1つのアプローチは、StandardObjectにフラグを追加して設定するか、列挙型を入力し、オブジェクトを処理するときにこれを確認することです。例えば
if(standardObject.IsSpecial){...}
if(standardObject.ObjectType == StandardObjectTypeEnum.Special){...}
ただし、これは最善のアプローチとは思えません。
もう1つのオプションは、派生クラスを作成することです。
public class SpecialObject : StandardObject { }
したがって、プロパティをチェックするのではなく、タイプをチェックできるようになりました。例えば
if(standardObject.GetType() == typeof(SpecialObject)){...}
(実行内容によっては、型チェックの実装が異なる場合があります)
SpecialObjectは、StandardObjectを追加または変更しないことに注意してください。それは本質的に同じオブジェクトです。このアプローチには、より柔軟であるという利点があります(たとえば、SpecialObjectにいくつかのプロパティを追加できます)が、実際には変更されません。常に同じになります。
私には、継承がより良いアプローチのように思えます。タイプフラグはコードの臭いのように見え、今後の継承は正しいOOPアプローチのように見えます。ここで私がよくわからないのは、StandardObjectとSpecialObjectが同じであるとすると、これを行うのは悪い習慣ですか?それとも、これを避けるべき理由はありますか?
ここにも同様の質問があります:
しかし、議論のほとんどは、良いデザインと見なされるものではなく、チェスの問題に焦点を当てているようです
編集:
カプセル化が一般的な解決策のようです。カプセル化を回避した理由は、以下の例で最もよく説明されています。
- StandardObjectは本質的にDTOです
- StandardObjectのリストがあります。
- リストが処理され、StandardObjectがシリアル化されます
- シリアル化されたデータは、任意の数の異なるプロトコルを介してどこかに送信されます
- StandardObjectが「特殊」である場合、プロトコルの1つで特定のパラメーターを設定する必要があります
「特殊な」ケースの追加ロジックは、StandardObjectを処理するいくつかの異なるメカニズムの1つでのみ必要とされるため、このロジックは、StandardObjectの近くにあるようには見えません。