前言
面向对象程序设计应遵循七大原则,以此提高代码的稳定性、易扩展、可复用、可维护。而不是CTRL+CV一把梭走天下,想要摆脱初级程序猿的称号,就应该从这里开始,不要总是想着程序和人有一个能跑就行,对自己的工作负责,也是对自己负责。
七大设计原则
设计原则名称 | 定义 | 使用频率 |
---|---|---|
单一职责原则 | 一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中 | ★★★★ |
开闭原则 | 软件实体应当对扩展开放,对修改关闭 | ★★★★★ |
里氏代换原则 | 所有引用基类的地方必须能透明的使用其子类的对象 | ★★★★★ |
依赖倒转原则 | 高层模块不应依赖低层模块,它们都应依赖于细节。抽象不应该依赖于细节,细节应该依赖于抽象 | ★★★★★ |
接口隔离原则 | 客户端不应该依赖那些它不需要的接口 | ★★ |
合成复用原则 | 优先使用对象组合,而不是继承来达到复用的摸底 | ★★★★ |
迪米特法则 | 每一个软件单位对其他的单位都只有最少的只是,二位局限于那些与本单位密切相关的软件单位 | ★★★ |
单一职责原则
定义
单一职责原则就是指就一个类而言,应该仅有一个引起它变化的原因,否则应该被拆分。核心就是控制一个类的粒度大小,将对象解耦,提高其内聚性。
作用
- 降低类的复杂性:一个类只负责一项职责,其罗技肯定要比负责多项职责简单的多
- 提高可读性:复杂性降低,就不会杂乱无章了没自然可读性也会提高
- 提高可维护性:该类就只负责处理某一具体功能,超出能力范围就可以考虑继承多态等方式去实现了
- 降低变更引起的风险性:变更是必然的避免不了,如果单一职责原则遵循的好,当修改一个功能时,可以显著降低对其它功能的影响
开闭原则
定义
开闭原则及开放-封闭原则,是指程序实体(类、模块、方法等)应该可以扩展,但是不可修改(或修改成本尽可能低)。通俗点说就是当应用的需求改变时,在不修改软件实体的源代码的前提下,可以扩展模块的功能,使其满足新的需求。
作用
- 方便测试:测试时只需要对扩展的代码进行测试
- 提高复用性:粒度越小,复用的可用性越大
- 提高代码健壮性:稳定并且易于扩展和维护
实现方式
通过“抽象约束,封装变化”来实现开闭原则。通过接口或抽象类为程序实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
举个栗子
你是一名程序猿,你的本职工作就是CRUD(狗头.JPG),你的BOSS让你去打扫厕所,让你做美工,这合适吗?显然不行,你只需要做好你的本职工作就行,其它工作有相对应的岗位来做。
依赖倒转原则
定义
抽象不应该依赖细节,细节应该依赖于抽象。高层模块不应该依赖低层模块两个都应该依赖抽象。通俗点说就是要针对接口编程,而不是针对实现编程。
作用
- 高内聚,低耦合
- 提高稳定性
- 降低并行开发引起的风险
- 提高可读性和可维护性
实现方式
- 每个类经可能提供接口或抽象类,或两者都具备
- 变量的声明类型尽量时接口或是抽象
- 任何类都不应该从具体类派生
- 使用继承时尽量遵循里氏替换原则
举个栗子
PC电脑是由主板、CPU、内存条、显卡、电源等多个组件组合而成的,主板按照某一标准规则预留了插槽、针脚等、如果主板坏了,只需要换一个主板即可,而不是主板坏了则其它的CPU、内存条那些全都得跟着一起换,这就体现了,高层不应该依赖低层。就好比它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,更换任何一个部件对其他都没有影响。
里氏替换原则
定义
子类必须能够替换它们的父类。通俗点说就是继承必须确保类所拥有的性质在子类中仍然成立。子类可以扩展父类的功能,但不能改变父类原有的功能。
作用
- 克服了继承中重写父类造成的可复用性变差的缺点
- 保证动作准确性:即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性
实现方式
在继承时,除添加新的方法完成新功能外,尽量不要重写父类的方法
举个栗子
现在有一只会飞的鸟,具体点一只麻雀,在设计抽象层时,里面有一个飞行动作的方法,而此时有一头鸵鸟,能继承这个父类吗?显然不太合适,鸵鸟虽然也是鸟,可是并不会飞,一旦继承,它将会拥有飞的功能。
迪米特法则
定义
如果两个类不必直接通信,那么这两个类就不应当直接发生直接的相互作用,。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
作用
解决类之间的松耦合关系,类之间的耦合越若,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
实现方式
定义接口或父类,具体实现类有相互调用的地方则通过父类"中转"
举个栗子
初入职场,进公司报道时,人事部叫你去找IT部鲁工领电脑及办公设备,然而鲁工今天恰好有急事外出了,你又去找了IT部另外的同事,人家一看是让你去找鲁工,就不乐意接你这活了,你就在办公室摸鱼摸了一天,如果IT部有一个主管(表示抽象父类或接口),人事部让你去找IT部(主管),要是鲁工不在,主管就会去安排另外的同事与你对接。
TODO
- [ ] 接口隔离原则
- [ ] 合成复用原则