我一直在研究开闭原理,它听起来不错,所以我想练习它的教义。
我把我新发现的知识应用到一个现有的项目中,并且马上就有点被卡住了。
如果出现了一个新的usertype(这很有可能),则需要对其进行更改,它还没有关闭以进行修改。怎么能避开这个?
据我所读,听起来我应该在这里实现一个工厂,而不是应用ocp?
Factory which breaks Open-closed principle
private void BuildUserTree(User user)
{
switch (user.UserType)
{
case UserType.FreeLoader:
BuildFreeLoaderTree();
break;
case UserType.Premium:
BuildPremiumTree();
break;
case UserType.Unlimited:
BuildUnlimitedTree();
break;
default:
throw new Exception("No UserType set");
}
}
谢谢,
科汉
最佳答案
就像任何“原则”一样,ocp并不是你在任何场合都必须遵守的规则。
我们被告知“更喜欢组合而不是继承”,然而像decorator和composite这样的模式公开地促进了继承。
类似地,我们被告知“编程到一个接口,而不是实现,然而,在我们的应用程序中的某个时刻,我们将不得不实例化某种描述的具体对象。
您的解决方案是一个典型的工厂习惯用法(如果不是完全的工厂方法或抽象工厂模式)。这就是它的目的。试图将ocp应用于它是没有意义的。
事实上,通过创建这个方法,实际上可以在代码库的其他部分促进ocp。你的应用程序中的一些其他类现在可以遵从ocp,现在你已经分离了创建。