文章目录
面向对象的开发原则
开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则,合成复用原则
开闭原则:
开闭的定义:
软件实体(模块、类与接口、方法)对拓展开放,对修改关闭。含义就是,当需求发生改变,要添加新模块或新功能时, 我们不要去修改软件实体的源代码或二进制代码或者破坏当前 代码结构前提下,拓展模块的功能。
开闭的目的:
让软件实体拥有一定的适应性和灵活性还有稳定性和延续 性。也就是软件适应环境变化,容易拓展新功能,能够平稳运行。
开闭的作用:
- 测试上不需测试原有代码,仅仅测试拓展的代码
- 提高代码可复用性,粒度越小,更能被复用。
- 增强软件实体的可维护性。如果软件实体本身可以平稳运行, 这是仅仅对新功能进行维护即可。
开闭的实现方法:
请记住“抽象约束,封装变化”的思想。利用抽象类和接口软件实体设计一个相对稳定的顶层结构,当需要拓展新功能或模块需要更改功能时,通过派生子类或实现接口的实现类,实现不改变原来代码,拓展新功能。
开闭的例子:
里氏代换原则:
里氏代换定义:
继承必须确保超类所拥有的性质在子类中仍然成立。大概意思是,不建议在子类中复写父类的代码,即尽量不要复写父类中已经实现的方法。
里氏代换原则目的:
阐述何时使用继承,反映了基类与子类的关系,对开闭原则进行补充,是实现抽象化的具体步骤。
里氏代换原则作用:
- 里氏代换原则是开闭原则的实现方式之一。
- 它克服了继承中重写父类所造成的复用性变差的缺点。子类中,重写了父类的方法导致父类原有的特性被更改得面目全非了。这就造成父类复用性变差的因素。
- 是动作正确性的保证,也就是说类的拓展不应该引入新的错误,需要降低代码的错误率。
里氏代换原则实现方法:
- 主要思想是子类拓展父类的功能,但不能改变父类的原功能,举个例子,原本父类是视频的编解码功能,而子类却实现的功能是音频的编解码。 那么如果子类是实现MP4编解码功能那是可以的,因为MP4也是一种视频。
- 如果程序违背了里氏代换的原则,我们需要做的是为新功能重新设计继承关系。
里氏代换原则注意:
如果是通过重写父类实现新功能,会导致整个继承体系的代码可复用变差;如果当多态运用比较频繁,程序出错率大大增加。
依赖倒置原则:
依赖倒置原则的定义:
原始定义:高层模块不应该依赖低层模块,两者应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。实际上是面向接口编程,不要面向具体类编程。
好比如,传参尽量传抽象层的变量,如接口或抽象类。声明变量时,类型最好是接口,将具体类对象赋值給接口。在Java中,类与类之间的依赖,最好通过抽象来实现。
依赖倒置原则目的:
通过面向接口的编程,以达到降低类之间的耦合性
依赖倒置原则的作用:
- 降低类之间的耦合性
- 提高系统稳定性
- 降低并行开发的风险,因为传入参数和返回值基本上在开发前确立。
- 提高代码可读性和可维护性
依赖倒置原则的实现:
- 每个类都应该提供接口或抽象类
- 变量的声明尽可能是接口或抽象类
- 任何类都不应改重具体类中派生
- 使用继承时尽量遵循里氏代换的原则
单一职责原则:
单一职责原则的定义:
又称为单一功能原则,单一职责原则规定一个类有且仅有一个引起它变化的原因,否则需要拆分该类。
单一职责原则的目的:
控制类的力度大小,将对象解耦、提高内聚性。
单一职责原则的有点:
- 降低类的复杂度。
- 提高代码可读性。复杂度降低,能更好阅读代码。
- 提高系统的可维护性。可读性提高,更容易定位错误代码位置。
- 降低变更所引起的风险。当功能变更错误,不会影响到一起功能的使用。
单一职责原则的实现:
单一职责原则虽说简单,但是实现起来很难。需要开发人员对业务流程非常熟悉,将系统切割成多个具有单一职责的模块,且模块中的方法也要遵循单一职责原则。否则方法颗粒过重,不好重用以及不好维护。
接口隔离原则(ISP):
接口隔离原则定义:
-
罗伯特.C.马丁给定义:客户端不应该被迫依赖于它不使用的方法。
-
另一说法是,一个类对另一个类的依赖应该建立于最小的接口上。
好比如,一个角色对应一个接口,同范畴行为对应一个接口。接口最重要是对外开放,当你的系统可供外部调用时,可能有不同的人要调用系统的数据,或者上传数据交由系统处理在返回结果。由此一来获取数据范畴的操作对应一个接口,处理上传数据又对应一个接口。不要将处理数据的接口与获取数据接口混合了,然而继续隔离接口,不同角色能够获取的数据类型也不同、权限也不同,所以针对角色的操作范畴各自对应一个接口,知道接口粒度大小适中即可,不宜过大或过小。处理数据接口亦同理。
接口隔离原则优点:
- 将大接口细分成专用接口,以预防外来变更的扩散,提高系统的灵活性和可维护性。
- 提高系统的内聚性,降低耦合性。
- 合理控制接口的粒度,可保证系统的稳定性;若过小,则接口大爆炸,是的整体架构变得发杂;过大,则灵活性下降,难以提供定制服务,接口承载方法过重,导致实现类本不需要的方法却需要实现。
- 使得接口层次清晰,易于理解,便于阅读。
- 降低代码的冗余。
接口隔离原则实现:
- 合理控制接口粒度,如一个接口仅服务一个子模块或业务逻辑
- 为依赖接口的类定制服务。
- 了解环境,根据环境决定如何定制接口。
- 提高内聚,减少对外交互。是接口用最少的方法来完成最多的任务。
与单一职责原则的不同之处:
- 首先说一下它们的共同点,都是封装的思想,也是为解耦、提高内聚性。
- 单一职责原则侧重于职责的切分,达到粒度控制;然而接口隔离原则,是对接口依赖的隔离,从而控制力度的大小。
- 单一职责原则是针对类而言的,主要从程序的实现和细节方面开刀;然而接口隔离原则是针对接口而言的,主要从程序的抽象设计和整体框架上下手。