我正在尝试将 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(?),因为在这种情况下 SomeObject 几乎就像一个 DTO,它的责任不是如何知道如何存储自己。
如果出现了 SomeObject 的新实现,缺少谁的 store 实现,我会因为 Model 类的 Store 方法中的异常而出现运行时错误,这也感觉像是代码异味。
这是因为调用代码的形式为
IEnumerable<SomeObject> sequence;
我不会知道序列对象的具体类型。
我似乎无法掌握 OCP 的概念。任何人都有任何具体示例或链接,而不仅仅是一些汽车/水果示例?