详细介绍开闭原则(OCP)
创始人
2024-08-02 13:10:29
0

开闭原则的意思是软件实体应该对扩展开发,对修改关闭(Software entities should be open for extension,but closed for modification)。实现开闭原则的途径是抽象,将需要扩展的部分抽象出来,并留出扩展接口。打个比方,比如电脑机箱上有usb的插口,这些插口就是可扩展的部分,我们可以在这些usb插口上插上鼠标,键盘,U盘,还可以插上网银的U盾等等。电脑硬件上对于usb接口的这个设计就是一个符合开闭原则的设计。

为什么要遵循开闭原则呢?因为开闭原则可以使软件系统更容易复用,更容易维护,当某个软件实体,不适合了,我可以重新做另外一种实现,并将现有的实现替换掉。比如说统计个税的算法发生了一些变化,我可以在不改变原有代码的情况下,重新实现一个算法将原有的算法替换下来。比如说杀毒软件,在出现一种新的病毒时,开发出一个查杀这种病毒的新模块,可以只开发更新这个查杀模块,而不需要改变原有系统的内容。

开闭原则这么好,如何实现符合开闭原则的软件系统呢?答案是抽象,将可能发生变化的功能点进行抽象,并留出变化的接口。设计模式中很多模式都可以帮我们实现开闭原则,个人的理解设计模式是对抽象用法的一种总结。

其实我们在项目已经为开闭原则做了一些工作了,比如说我们进行三层开发,将数据层抽象出来,并定义个数据处理的接口,我们可以通过新开发一个数据层把刚开始将数据存放到SQL Server中的实现,修改为将数据存放到my sql中的实现;我们将业务逻辑中的代码从UI代码中分离出来,这就为我们复用业务逻辑的代码提供了可能,我们可以开发一个专门为手机使用的UI层出来,当用户用手机访问我们的系统时,智能的切换到手机UI层的代码上去执行。

实现开闭原则的例子,其实我都不好意思自己举例子了,因为我正在使用Office 2007写这篇博客,在Office2007的快捷工具栏中就有一项是加载项,就是说Office 2007能将插件加载进来使用,如下图所示:

图一

Snagit在word中添加了一个插件,这种插件技术就是一种遵循OCP的实现;再说我们整天使用的Visual Studio 它的可扩展程度更高,可以开发很多类型的工具对他进行扩展。

为了本文的完整性,我还是厚着脸皮,用重构的方式举一个遵循开闭原则的微不足道的实现。

下面的举例实现的场景是个税的计算:我的***个版本是这样子的

  1. class Program   
  2. {   
  3. static void Main(string[] args)   
  4. {   
  5. float salary = 10000;   
  6. Console.WriteLine("收入是{0}的人应缴个税是{1},",salary, GetTax(salary));   
  7. }   
  8. static float GetTax(float salary)   
  9. {   
  10. return (float)(salary * 0.03);   
  11. }   

 

这个版本中我未做任何抽象,直接调用静态方法算了,可是一不小心开两会了,个税要调整了,于是个税的算法要进行调整了,怎么办呢,因为要少缴税,我很高兴的就要来重构上面的代码了,既然个税的计算方法是一个变化的东西,我就把它抽象出来吧。

 

  1. class Program   
  2. {   
  3. static void Main(string[] args)   
  4. {   
  5. float salary = 10000;   
  6. Console.WriteLine("收入是{0}的人应缴个税是{1},",salary, GetTax(salary));   
  7. }   
  8. static float GetTax(float salary)   
  9. {   
  10. ITaxCalculateStrategy strategy = GetTaxCalculateStrategy();   
  11. return strategy.GetTax(salary);   
  12. }   
  13. ///    
  14. /// 获得应该使用的个税计算方法   
  15. ///    
  16. /// 个税计算方法实现实例   
  17. static ITaxCalculateStrategy GetTaxCalculateStrategy() {   
  18. string typeName = ConfigurationManager.AppSettings["TaxCalculateStrategyType"];   
  19. if (string.IsNullOrEmpty(typeName))   
  20. throw new ConfigurationErrorsException("请配置TaxCalculateStrategyType");   
  21. Type type = Type.GetType(typeName);   
  22. if (type == null) throw new ConfigurationErrorsException("TaxCalculateStrategyType错误");   
  23. return (ITaxCalculateStrategy)Activator.CreateInstance(type);   
  24. }   
  25. }   
  26. ///    
  27. /// 定义个税计算的接口   
  28. ///    
  29. public interface ITaxCalculateStrategy   
  30. {   
  31. float GetTax(float salary);   
  32. }   
  33. ///    
  34. /// 两会前个税计算办法的实现   
  35. ///    
  36. public class TaxCalculateBefore2Conference : ITaxCalculateStrategy   
  37. {   
  38. float ITaxCalculateStrategy.GetTax(float salary)   
  39. {   
  40. return (float)(salary * 0.03);   
  41. }   
  42. }   
  43. ///    
  44. /// 两会后个税的计算方法   
  45. ///    
  46. public class TaxCalculateAfter2Conference:ITaxCalculateStrategy   
  47. {   
  48. float ITaxCalculateStrategy.GetTax(float salary)   
  49. {   
  50. return (float)(salary * 0.020);   
  51. }   

 

因为要少缴税,所以我很愉快的重构了之前的代码,可以转眼两会开完了,结果并非如我预期的个税变化,咋办呢?没关系我们重新开发一个个税计算方法,修改下配置就可以仍旧使用之前的个税计算办法了。

开闭原则实现的关键点在于抽象,也许我们刚开始不知道该把那部分抽象出来,但是这并不是问题,我们可以遵循简单设计的原则,当变化来了的时候,再重构代码,做到一种满足开闭原则的设计。

切忌到处都抽象,如果到处都抽象就会导致系统过度设计,过度复杂。这反而是不利于系统的维护。完全的开闭原则是不可能实现的,所以请保持简单设计,在需要的时候做符合开闭原则的设计。

通过本文对开闭原则的介绍,希望对你有帮助。

【编辑推荐】

  1. C#3.0中对象初始化器和集合初始化器
  2. C#.Net ArrayList的使用
  3. C#中 As 和强制转换的总结
  4. 漫谈C#开发中的ASP.NET页生命周期
  5. 分享c#常用函数和方法集

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...