我想将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走来谁的存储实现丢失 我会得到运行误差由于Model类在商店的方法外,还感觉就像一个代码味道。
这是因为调用代码将在
IEnumerable<SomeObject> sequence;
形式我不知道具体类型的序列对象。
我似乎无法理解OCP概念。任何人都有具体的例子或链接,不仅仅是一些汽车/水果的例子?
如果您可以显示Store方法的不同之处,将会好得多。 – tafa 2010-04-22 10:56:15
在SomeObject中有一个虚拟的'Store'函数真的会这么糟糕吗? (http://www.martinfowler.com/bliki/AnemicDomainModel.html) – 2010-04-22 11:01:15
您可能希望实施一种策略模式,因为您的代码不会太臭,违反了单一责任原则。 – Kane 2010-04-22 11:07:00