在对面向对象不断学习的过程中,在原来的基础之上,总会有新的收获,进一步的认识。下面跟大家分享:面向对象设计中的应遵循的三大原则。
单一职责原则(SRP)
一、什么是单一职责?
生活中,我们所使用的手机功能不胜枚举,但是就单一拍摄功能而言,却不敌专业DV。类与之同理,应遵循单一职责原则,也就是尽力使之功能单一,引起其变化的因素单一。
为要遵循单一职责原则?
功能间强耦合:一个类中,功能过多,就相当于把这些职责都耦合在一起,导致无论改动哪儿,都需要在类中动手脚,导致改动维护麻烦,代码不可能复用,缺乏灵活性。同时也可能会削弱或者抑制这个类完成其他的功能。这就与为什么四肢发达的手机,在就单一拍摄功能而言,不敌专业DV同理。
开放—封闭原则(OCP)
一、什么是开放封闭原则?
软件实体(类、模块、函数等等)应该对扩展开放,对更改封闭的原则。例如生活中,面对考研的下定狠心同学,这个决定是雷打不动的,即对修改(改变)关闭(closed for modification)。但某些招聘机会,却不得错失,那么我们应保持得态度就该对此机会开放(open for extension)。如此一来,考研求职两不误。在面向对象设计中,这一原则就是开放—封闭原则(OCP)。
二、为什么要遵循单一职责原则?
在软件设计过程中,需求总在变动。作为设计人员决不能指望一开始,就敲定用户需求。这就考虑到新旧版本间的转换,只需要针对新需求对软件做简单的扩展,而非彻底从头到尾的修改源程序,否则这样的工程量将是巨大的,毁灭性的。
三、注意事项
1、OCP原则应该从软件设计早期开始,设计时便开始时刻考虑。
2、从全局角度看问题,在发生小变化时,便考虑到会否发生长远的变化较大的问题,从而提前采取行动,考虑重构抽象等。
依赖倒转原则(DIP)
一、什么事依赖倒转原则?
我们在设计过程中,常出现这样的情况,高模块直接依赖底层模块进行设计。设想一个问题,如果底层模块出现问题时,我们设计的那么多依赖于此的高模块境地该有多尴尬。例如你电脑内存条坏了,不至于把整个CPU进行修理更换。所以依赖倒转,指的便是高层块不应依模赖于低层,两者都应该依赖于抽象。抽象也有讲究,不应依赖与细节,反倒是细节应该依赖与抽象。
下面让我们来看看应遵循依赖倒转的另一有利证明:
二、里氏代换原则:
1、子类必须能完全替换掉父类才能称之为继承。例如企鹅在编程的世界里,就不属于鸟父类的子类。因为它不具有飞的功能,不能完全替代它的父类。
2、里氏代换使得继承复用成为可能,只有子类可以完全替代父类时,使用子类,软件功能才不会受到影响,而子类也可青出于蓝而胜于蓝。
3、里氏代换使得OCP成为可能。如果子类在不能完全替代父类的情况之下使用,何谈对类的扩展开放,修改关闭。
4、里氏代换与依赖倒转,我们可以逆向思考,如果承认了不会飞的企鹅继承与鸟类,那么在使用企鹅飞方法时,程序必然出错。这也反向证明了当高层模块依赖低层时,程序容易出现的错误。这也是为什么在此提出里氏代换的原因。
三大原则运用于现实生活
|
编程世界 |
VS |
现实生活 |
SRP |
类功能专一,避免强耦合 |
异 |
一专多杂 |
OCP |
可扩展,不可大幅度修改 |
同 |
下定决心 |
DIP |
基于抽象,不基于低层 |
同 |
根坚叶繁 |
1、对于编程世界,单一职责要求类的功能单一,避免类间功能的强耦合。但是现实原则却与之相异,我们除了要有一门专业才能做支撑之外,同时学习能力要像蔓条一样发达,方方面面都提倡多多涉猎了解,让人生更加丰富多彩。
2、开放封闭原则则与现实生活一致,对于雷打不动的目标,都需要下定决心,不要轻易进行翻新整修。可以有新的需求是对原来的目标进行扩展,但不可大幅度修改甚至完全推翻既定的目标。否则根基不停的变动,何来高楼大厦一说。
3、对于依赖倒转原则,也可以联系实际,像科研人员做实验,如果偷懒想要依赖于别人的实验结果,那当此结果出现错误或者明显误差的基础之上再利用,则会导致根本性的错误和实验的失败。所以最初依赖的根基一定要结实,对于类而言就是够抽象,足以代表大众,在此之上生长的大树才能欣欣向荣,枝繁叶茂。