OCP をコード スニペットに適用しようとしていますが、現在の状態では非常に臭いですが、最後まで到達していないと感じています。
現在のコード:
public abstract class SomeObject
{}
public class SpecificObject1 : SomeObject
{}
public class SpecificObject2 : SomeObject
{}
// Smelly code
public class Model
{
public void Store(SomeObject someObject)
{
if (someObject is SpecificObject1)
{}
else if (someObject is SpecificObject2)
{}
}
}
それは本当に醜いです、私の新しいアプローチは次のようになります:
// No so smelly code
public class Model
{
public void Store(SomeObject someObject)
{
throw new Expception("Not allowed!");
}
public void Store(SpecificObject1 someObject)
{}
public void Store(SpecificObject2 someObject)
{}
}
新しい SomeObject 型が登場したら、その特定のオブジェクトを格納する方法を実装する必要があります。これにより、OCP が壊れてしまい、モデル クラスを変更する必要があります。
ストア ロジックを SomeObject に移動するのも間違った原因だと感じているので、SRP に違反します (?)。
Store の実装が欠落している SomeObject の新しい実装が登場すると、Model クラスの Store メソッドで例外が発生し、実行時エラーが発生します。これもコードの匂いのように感じます。
これは、呼び出しコードが次の形式になるためです。
IEnumerable<SomeObject> sequence;
シーケンス オブジェクトの特定の型はわかりません。
OCP の概念を理解できないようです。車/果物の例以上の具体的な例やリンクはありますか?