38

关于面向对象中的“六原则一法则”

 5 years ago
source link: https://www.tuicool.com/articles/RVFjQrz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

六原则一法则

  1. 单一职责原则
  2. 开闭原则
  3. 依赖倒转原则
  4. 里氏替换原则
  5. 接口隔离原则
  6. 合成聚合复用原则
  7. 迪米特法则

单一职责原则

一个类只做它该做的事情。

单一职责原则的核心就是高内聚,即一个 模块只完成一项功能。单一职责,顾名思义就是一个类只有一个职责,只做一件事情。我们在大学里学的软件工程和软件项目管理中,老师都在强调软件设计要追求“高内聚、低耦合”,以提高模块的重用性和移植性,而单一职责原则就很好的说明了高内聚。

开闭原则

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

开闭原则的关键就是抽象化,我们在代码编写的时候,先利用接口和抽象类构建好一个相对稳定的抽象层,而将具体的功能在实现层中编写。如果需要修改或扩充系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,达到在进行功能拓展时无序修改现有代码的效果,达到开闭原则的要求。

依赖倒转原则

程序要依赖于抽象接口,不依赖于具体实现。

直白的讲就是我们常提到的面向接口编程。声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代。

里氏替换原则

任何时候都可以用子类型替换掉父类型。

因为子类是增强父类的能力,而不是减少父类的能力,所以用父类型的地方就一定能使用子类型。里氏替换原则可以检查继承关系是否合理,如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的,需要对代码进行重构。

接口隔原则

接口要小而专,绝不能大而全。

不能把接口设计的过于臃肿和复杂。例如,琴棋书画就应该分别设计为四个接口,而不应设计成一个接口中的四个方法,因为如果设计成一个接口中的四个方法,那么这个接口很难用,毕竟琴棋书画四样都精通的人还是少数,而如果设计成四个接口,会几项就实现几个接口,这样的话每个接口被复用的可能性是很高的。

合成聚合复用原则

优先使用聚合或合成关系复用代码。

组合和聚合都是对象建模中关联(Association)关系的一种。聚合表示整体与部分的关系,表示“含有”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。在类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。聚合和合成都属于关联关系。

其他大佬那里看到的一个比较好的例子:

我们需要办理一张银行卡,如果银行卡默认都拥有了存款、取款和透支的功能,那么我们办理的卡都将具有这个功能,此时使用了继承关系:

2eI3Mj6.png!web

为了灵活地拥有各种功能,此时可以分别设立储蓄卡和信用卡两种,并有银行卡来对它们进行聚合使用。此时采用了合成复用原则:

aym2UbQ.png!web

迪米特法则

一个对象应该对其他的对象有尽可能少的了解,又叫最少知识原则。

这个具体讲指的就是低耦合,由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。设计模式中的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。

门面模式(Facade)

其含义时引入一个第三方中介类,这个类集合了多个零部件类的功能,实际功能则委托给这些零部件对象,这个类只是做为对外统一接口,只是一个马甲。

Ifqyaue.png!web

中介模式(Mediator)

其含义是用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。即通过一个中介类接受所有消息,然后再进行转发。

aMVJ3qj.png!web


Recommend

  • 41
    • yi-love.github.io 6 years ago
    • Cache

    面向对象设计原则之迪米特原则

    免责声明:本文内容大都来源于网络 迪米特原则定义 狭义的迪米特原则定义:也叫最少知识原则(LKP,Least Knowledge Principle)。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一...

  • 47

    昨天我看了单一职责原则和开闭原则,今天我们再来看里式替换原则和依赖倒置原则,千万别小看这些设计原则,他在设计模式中会有很多体现,所以理解好设计原则之后,那么设计模式,也会让你更加的好理解一点。 前言 在...

  • 59
    • www.tuicool.com 5 years ago
    • Cache

    面向对象的设计原则最终篇

    关于面向对象的设计原则我之前已经解释过四种了,分别是单一职责原则,开放关闭原则,里式替换原则,依赖倒置原则而接下来我们要解释的就是最后的三种原则了,分别是接口隔离原则, 迪米特法则, 组合复用原则 前言 ...

  • 37

    在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。 如果两个类是“Has-a”关系应使用合成、聚合,如果是“Is-a”关系可使用继承。”Is-A”是严格的分类学意义上定义...

  • 26

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能...

  • 13

    这是 “Python 工匠”系列的第 14 篇文章。[查看系列所有文章]

  • 2

    面向对象设计模式的核心法则 浏览:2745次  出处信息 有本经典的书叫《设计模式》,讲了经典的21种设计模式,...

  • 11

    面向对象设计原则 开放封闭原则:   一个软件实体如类、模块和函数应该对拓展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。 里氏替换原则:   所有引用的父类的地方必须能透明的使用其子类的对象

  • 5

    面向对象设计原则 都是为了高内聚低耦合原则。编程时基本都要遵守 单一职责原则 分类原则:一种人只干一种事。 举例:(比较简单...

  • 9

    最近在看许世伟的架构课, 面向对象五大设计原则(SOLID),扣理论找出处。 早期我跟着大家人云亦云, 回过头来,抠字眼找出处, 五大设计原则真的很有功力。 注意区分设计原则和设计模式。 设计原则更为抽象和泛化; 设计模式...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK