开闭原则(OCP)

什么是软件设计原则

造软件开发中,要在保证安全性、稳定性和可维护性的同时,兼顾扩展性和灵活性,软件的设计需要遵循六大原则:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。

软件调整带来的问题

一个可靠的软件程序必然是经过系统的测试,确定无误后投入使用的。
但现实情况往往需要软件顺应变化而做出调整,修改已有的代码则可能引入错误,要保证可靠性,又需要再次进行测试,这意味着每次的调整都可能付出巨大的成本。
为了降低成本,我们可以考虑尽量通过增加新代码来实现变化,而不是修改已有的代码,这便是开闭原则的核心目标。

定义

开闭原则(Open-Closed Principle, OCP):

原始定义:
Software entities (classes, modules, functions) should be open for
extension but closed for modification。[^1]
译:一个软件实体(包括类、模块、功能等)应当对扩展开放,对修改关闭。

理解

  • 对扩展开放:

软件中的现有实体,应当在保证自身功能的基础上,允许通过扩展的方式添加或改变其功能。
当软件需要变化时,尽量通过扩展现有实体的方式实现需要的变化。

  • 对修改关闭:

当软件需要变化时,尽可能不修改现有实体的代码。

  • 整体

在面向对象的开发思想中,我们尽可能的还原现实中的实体,为实体赋予属性和行为(方法),通过实体间的互动实现软件的功能。
为了模拟足够多的实体,我们制定统一的标准,根据实体间的共性为实体分类,进而根据类的共性抽象出接口和抽象类。
当设计一个软件时,先将软件可能涉及到的实体总结起来,合理分类,通过抽象来构建软件的框架,
再在编写功能时,将抽象实例化为一个个具有特性的实体,不同的功能即是不同组合的多个实体间的互动。
如果软件的框架抽象的足够合理,那么软件就具有足够的灵活性和适应性,
当软件功能需要改变时,就可以通过获取新的实体,产生新的实体组合,从而实现新的功能,而不必去修改已有的实体;

  • 结合其他原则

单一职责原则要求实现类要职责单一;
里氏替换原则要求不要破坏继承体系;
依赖倒置原则要求面向接口编程;
接口隔离原则要求在设计接口的时候要精简单一;
迪米特法则要求降低耦合。
遵循另外的五项原则,可以让抽象更合理,而开闭原则更像是一个综合的结果:
框架抽象的合理了,
我们便有了足够的“开”的自由——随时获得顺应变化的新实体,
同时就做到了尽可能的“闭”——鲜有新功能需要改动已有的实体;

[^1]Meyer, Bertrand (1988). Object-Oriented Software Construction. Prentice Hall. ISBN 0-13-629049-3.

参考:https://wiki.jikexueyuan.com/project/java-design-pattern-principle/principle-6.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值