浅谈面向对象的单一职责原则与开放封闭原则

来源:互联网 发布:大数据算法有哪些 编辑:程序博客网 时间:2024/04/29 23:55

单一职责原则的核心思想一个类,最好只做一件事,只有一个引起它的变化。通常意义下的单一职责,就是指只有一种单一功能(该功能不会再去考虑分割),不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因,这也就是开发者宁愿写更多的代码去实现多层次继承关系,来保证每个类只完成它的特定职责。当一个类职责过多时,可能引起它变化的原因就越多,这将导致职责依赖,相互之间产生影响。

当一个类有A,B两个职责时,在创建使用该类的对象时就要考虑三种情况。1.实现A职责不实现B职责,2.实现B职责不实现A职责,3.同时实现A,B职责。(不考虑两个职责都不实现的情况,如果什么职责都没有,你创建这个类就没意义了)。同理,当有三个职责时就有7种情况要考虑,当有n个职责时就要考虑2^n-1种情况。这会造成代码的逻辑关系处理难度呈指数型增长,从而大大损伤其内聚性并增加了耦合度,那么当后续开发者在继承这个类的基础上开发新功能时,难度将会非常大。而我们之所以能在功能如此复杂的Android原生应用上进行再次开发的原因,也就是因为它极大程度上贯彻了该项原则。

再来谈谈开放封闭原则,其核心思想是软件实体应该是可扩展的,而不可修改的,也就是对扩展开放,对修改封闭。该原则实施的前提是,已实现功能片段的代码已经很完善了,不需要修改了,也就是说该原则是在有增加新功能时才去考虑的。面向对象编程中的继承,接口,抽象类等的设计都是为了便于该原则的实行。

开放封闭原则主要体现在两个方面:
1、对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
2、对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。也就是说,当你觉得你增加的新功能与已有代码产生冲突时,要以扩展的形式去解决冲突,而不是修改已有的代码,使两种功能混在一起。

举例:一种较简单的扩展方式就是,增加一个控制新功能代码片段的boolean类型变量,默认为false,即不执行新加的功能片段(这样可以排除新功能对已有功能的影响),然后在你确定要执行该功能的对象里面找个合理的时间点set为true即可。

该两项原则是面向对象的核心,面向对象的其它原则实质上也是在更细节的阐述并体现这两项原则。这些原则并不是强制不可违背,但遵循这些原则才能提高代码的可读性,可复用性以及可扩展性。