【发布时间】:2018-03-09 15:46:18
【问题描述】:
单一职责原则指出:
一个班级应该有一个,而且只有一个改变的理由。
开放/封闭原则指出:
您应该能够扩展类行为,而无需修改它。
如果一个类应该只有一个改变的理由,但不应该被修改,那么开发人员如何同时遵守这两个原则?
示例
工厂模式是一个很好的例子,它具有单一职责,但可能违反开放/封闭原则:
public abstract class Product
{
}
public class FooProduct : Product
{
}
public class BarProduct : Product
{
}
public class ProductFactory
{
public Product GetProduct(string type)
{
switch(type)
{
case "foo":
return new FooProduct();
case "bar":
return new BarProduct();
default:
throw new ArgumentException(...);
}
}
}
当我需要在后期将ZenProduct 添加到工厂时会发生什么?
- 这肯定违反了开闭原则?
- 我们如何防止这种违规行为?
【问题讨论】:
-
@Ravi butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod 来自在开发者社区中享有盛誉的 Bob 叔叔。
-
你能概括出一个矛盾吗?举个例子可能会很方便。
-
@0b101010 查看更新。
-
在您的示例中,我不认为添加 ZenProduct 会违反任何一个原则,因为您只是在执行日常维护/改进 - 这两个原则都没有表明一旦编写了类就可以永远不会改变,事实上这种改变是首先使用工厂的关键原因之一。但是,如果您认为是这种情况,那么您应该使 GetProduct() 成为一个虚拟方法,从而仍然满足这两个原则
-
@LordWilmore OCP 声明“一个类应该被关闭以进行修改”。因此修改它添加
ZenProduct违反了原则。我同意扩展工厂可以防止这种违规行为,但是开销很大,而且您还必须在其他地方违反 OCP,因为您必须修改一个类才能使用新工厂。
标签: oop solid-principles single-responsibility-principle open-closed-principle