面向对象设计原则

面向对象的开发原则

开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则,合成复用原则

开闭原则:

开闭的定义:

​ 软件实体(模块、类与接口、方法)对拓展开放,对修改关闭。含义就是,当需求发生改变,要添加新模块或新功能时, 我们不要去修改软件实体的源代码或二进制代码或者破坏当前 代码结构前提下,拓展模块的功能。

开闭的目的:

​ 让软件实体拥有一定的适应性和灵活性还有稳定性和延续 性。也就是软件适应环境变化,容易拓展新功能,能够平稳运行。

开闭的作用:

  1. ​ 测试上不需测试原有代码,仅仅测试拓展的代码
  2. ​ 提高代码可复用性,粒度越小,更能被复用。
  3. ​ 增强软件实体的可维护性。如果软件实体本身可以平稳运行, 这是仅仅对新功能进行维护即可。

开闭的实现方法:

​ 请记住“抽象约束,封装变化”的思想。利用抽象类和接口软件实体设计一个相对稳定的顶层结构,当需要拓展新功能或模块需要更改功能时,通过派生子类或实现接口的实现类,实现不改变原来代码,拓展新功能。

开闭的例子:

里氏代换原则:

里氏代换定义:

​ 继承必须确保超类所拥有的性质在子类中仍然成立。大概意思是,不建议在子类中复写父类的代码,即尽量不要复写父类中已经实现的方法。

里氏代换原则目的:

​ 阐述何时使用继承,反映了基类与子类的关系,对开闭原则进行补充,是实现抽象化的具体步骤。

里氏代换原则作用:

  1. 里氏代换原则是开闭原则的实现方式之一。
  2. 它克服了继承中重写父类所造成的复用性变差的缺点。子类中,重写了父类的方法导致父类原有的特性被更改得面目全非了。这就造成父类复用性变差的因素。
  3. 是动作正确性的保证,也就是说类的拓展不应该引入新的错误,需要降低代码的错误率。

里氏代换原则实现方法:

  1. 主要思想是子类拓展父类的功能,但不能改变父类的原功能,举个例子,原本父类是视频的编解码功能,而子类却实现的功能是音频的编解码。 那么如果子类是实现MP4编解码功能那是可以的,因为MP4也是一种视频。
  2. 如果程序违背了里氏代换的原则,我们需要做的是为新功能重新设计继承关系。

里氏代换原则注意:

​ 如果是通过重写父类实现新功能,会导致整个继承体系的代码可复用变差;如果当多态运用比较频繁,程序出错率大大增加。

依赖倒置原则:

依赖倒置原则的定义:

​ 原始定义:高层模块不应该依赖低层模块,两者应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。实际上是面向接口编程,不要面向具体类编程。

​ 好比如,传参尽量传抽象层的变量,如接口或抽象类。声明变量时,类型最好是接口,将具体类对象赋值給接口。在Java中,类与类之间的依赖,最好通过抽象来实现。

依赖倒置原则目的:

​ 通过面向接口的编程,以达到降低类之间的耦合性

依赖倒置原则的作用:

  1. 降低类之间的耦合性
  2. 提高系统稳定性
  3. 降低并行开发的风险,因为传入参数和返回值基本上在开发前确立。
  4. 提高代码可读性和可维护性

依赖倒置原则的实现:

  1. 每个类都应该提供接口或抽象类
  2. 变量的声明尽可能是接口或抽象类
  3. 任何类都不应改重具体类中派生
  4. 使用继承时尽量遵循里氏代换的原则

单一职责原则:

单一职责原则的定义:

​ 又称为单一功能原则,单一职责原则规定一个类有且仅有一个引起它变化的原因,否则需要拆分该类。

单一职责原则的目的:

​ 控制类的力度大小,将对象解耦、提高内聚性。

单一职责原则的有点:

  1. 降低类的复杂度。
  2. 提高代码可读性。复杂度降低,能更好阅读代码。
  3. 提高系统的可维护性。可读性提高,更容易定位错误代码位置。
  4. 降低变更所引起的风险。当功能变更错误,不会影响到一起功能的使用。

单一职责原则的实现:

​ 单一职责原则虽说简单,但是实现起来很难。需要开发人员对业务流程非常熟悉,将系统切割成多个具有单一职责的模块,且模块中的方法也要遵循单一职责原则。否则方法颗粒过重,不好重用以及不好维护。

接口隔离原则(ISP):

接口隔离原则定义:

  1. ​ 罗伯特.C.马丁给定义:客户端不应该被迫依赖于它不使用的方法。

  2. ​ 另一说法是,一个类对另一个类的依赖应该建立于最小的接口上。

    ​ 好比如,一个角色对应一个接口,同范畴行为对应一个接口。接口最重要是对外开放,当你的系统可供外部调用时,可能有不同的人要调用系统的数据,或者上传数据交由系统处理在返回结果。由此一来获取数据范畴的操作对应一个接口,处理上传数据又对应一个接口。不要将处理数据的接口与获取数据接口混合了,然而继续隔离接口,不同角色能够获取的数据类型也不同、权限也不同,所以针对角色的操作范畴各自对应一个接口,知道接口粒度大小适中即可,不宜过大或过小。处理数据接口亦同理。

接口隔离原则优点:

  1. 将大接口细分成专用接口,以预防外来变更的扩散,提高系统的灵活性和可维护性。
  2. 提高系统的内聚性,降低耦合性。
  3. 合理控制接口的粒度,可保证系统的稳定性;若过小,则接口大爆炸,是的整体架构变得发杂;过大,则灵活性下降,难以提供定制服务,接口承载方法过重,导致实现类本不需要的方法却需要实现。
  4. 使得接口层次清晰,易于理解,便于阅读。
  5. 降低代码的冗余。

接口隔离原则实现:

  1. 合理控制接口粒度,如一个接口仅服务一个子模块或业务逻辑
  2. 为依赖接口的类定制服务。
  3. 了解环境,根据环境决定如何定制接口。
  4. 提高内聚,减少对外交互。是接口用最少的方法来完成最多的任务。

与单一职责原则的不同之处:

  1. 首先说一下它们的共同点,都是封装的思想,也是为解耦、提高内聚性。
  2. 单一职责原则侧重于职责的切分,达到粒度控制;然而接口隔离原则,是对接口依赖的隔离,从而控制力度的大小。
  3. 单一职责原则是针对类而言的,主要从程序的实现和细节方面开刀;然而接口隔离原则是针对接口而言的,主要从程序的抽象设计和整体框架上下手。

迪米特法则:

合成复用原则:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值