什么是软件设计原则
造软件开发中,要在保证安全性、稳定性和可维护性的同时,兼顾扩展性和灵活性,软件的设计需要遵循六大原则:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。
软件调整带来的问题
一个可靠的软件程序必然是经过系统的测试,确定无误后投入使用的。
但现实情况往往需要软件顺应变化而做出调整,修改已有的代码则可能引入错误,要保证可靠性,又需要再次进行测试,这意味着每次的调整都可能付出巨大的成本。
为了降低成本,我们可以考虑尽量通过增加新代码来实现变化,而不是修改已有的代码,这便是开闭原则的核心目标。
定义
开闭原则(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