面向对象设计 开闭原则(OCP)

主目录: 一个面向对象设计(OOD)的学习思路设计

###啥是OCP?

  • 全称:开闭原则(Open-Closed Principle)[^foot2]
  • 定义:软件实体(类、模块、函数等等)应该是可以扩展的

###开(O)什么?关(C)什么?

开(O):对于扩展是开放的

对于某个模块的功能是可以进行扩展的。当需求改变,我们只需对其进行扩展即可满足于新的需求。

比如说:“砖”,我们不需要改变它的形态与结构,就可以根据需求来建高楼、建围墙、建厕所、建这样建那样(๑乛乛๑)。 - - 所以可以认为“砖”对于扩展的需求是开放的。又比如说电脑主板对于cpu、内存等是可扩展的。

关(C):对于更改是封闭的

对模块进行扩展时,不必改动模块的源代码或者二进制代码。如果说这个模块已经明确的定义、稳定、有效的被多个其他模块使用,那么关闭这个模块,提供接口供其它模块使用。

比如我们的电脑由“CPU”、“主板”、“内存”等构成,它们并不是紧紧耦合做成一块的。想想,要是紧紧的长一块,什么CUP、什么内存密密麻麻的小线、触角、身体的一部分和主板一体化。那么现在我的一个内存坏了,我表示我是渣渣得重新买一台电脑了,能内存修好的高手因该不多吧!就算内存能修好CPU又多少人能修好啊!但还好它们都是分离的,接口都是规定好了的,我需要买一个内存插上就好了。我们不需要知道知道内存里面、CPU里面是啥构造。要是坏了时,要是升级时,只需要更换这个模块而不需要更换整个硬件系统或修理这个硬件系统里的某个小模块。- - 原谅我废话了一大圈,就是想表达个封闭内部,能减少bug,方便扩展,能更好的分工合作(做主板的就做主板)

###为何要提倡OCP? 其实在上面大家因该已经明白一些了,“开放”是为了更好的扩展,适应更多的相应需求。“关闭”是为了降低耦合,降低了维护难度和制作成本。两者可以说本是互为一体,而又被分开说成两样。因为关闭时得留出口开放本就是处理的一个模块同时进行。

在许多方面,OCP的面向对象的核心所在 注意:

  • 我们因该对频繁出现的变化进行封闭开放处理也就是进行抽象
  • 拒绝不成熟的抽象和抽象本身一样重要

###比如说?(实际例子)

  • 违反OCP

上图展示了一个没有遵循OCP的设计例子,电灯类和电源类是两个具体的类。要让电灯发光,需要电源这个属性。如果此时要将电灯接在另一个电源上面,就必须更换成另一个电源的属性(将电灯连线与另一个电源)。

  • 遵循OCP

上图展示了一个解决上面问题的OCP设计,灯座是一个拥有抽象成员的接口(比如说与电源的连线)。电灯类使用这个抽象类(有插座的成员属性),而电灯的对象使用的是灯座接口的实现类电源。如果我们需要将电灯接到另一个电源,只需要接到另一插座。如果要更换电源,那么将插座接到另一个电源。这样双方的改变,被插座接口隔离而不会影响到具体的类。(我理解为隔离了变化的扩散)

注意
只有当我们预测到这种变化,那么就可以设计一个抽象来进行隔离
无论模块是多么的封闭都会存在一些无法对之封闭的变化(比如说我现在要让灯泡闪红光),没有对所有的情况都贴切的模型
设计人员必须对设计的模块应该对哪种变化封闭做出选择

###结论总结

  • 总的来说开闭原则也如锦上添花,在原有锦织物上增添鲜花,让美的东西更美。

  • 在许多方面,OCP都是面向对象的核心所在。遵循这个原则可给面向对象技术带来巨大的好处(灵活性、可重用性以及可维护性)。然而,并不是说只要使用一种面向对象语言就是遵循了这个原则。 -- [^foot1]

  • 对于应用程序中的每个部分都肆意地进行抽象同样不是一个好主意。正确地做法是开发人员应当仅仅对程序中频繁变化的那些部分做出抽象,拒绝不成熟的抽象和抽象本身一样重要。--[^foot1] ###参考文章[^foot1][^foot2][^foot3] [^foot1]:《敏捷软件开发:原则、模式与实践》第9章 开放-封闭原则 [^foot2]:维基百科-开闭原则 [^foot3]:《面向对象软件构造》第二版 中英对照 第3章 3.3五项原则

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值