不错,去看看中文图书全场满【99】元赠畅销书。。。

SOLID (面向对象设计)五大原则

SOLID单一功能、开闭原则、里氏替换、接口隔离以及依赖反转),指代了面向对象编程和面向对象设计的五个基本原则。这五大原则的指导和约束,往往有助于我们开发出清晰易读、便于扩展和维护的系统。SOLID也是是敏捷开发以及自适应软件开发等指导思想的重要组成部分。

首字母 指代 概念
S 单一功能原则
对象应该仅具有一种单一功能(职责)的概念。
O 开闭原则
“软件体应该是对于扩展开放的,但是对于修改封闭的”的概念。
L 里氏替换原则
“程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的”的概念。参考契约式设计。
I 接口隔离原则
“多个特定客户端接口要好于一个宽泛用途的接口”的概念。
D 依赖反转原则
一个方法应该遵从“依赖于抽象而不是一个实例”的概念。
依赖注入是该原则的一种实现方式。

一、单一功能原则

(SRP:Single responsibility principle)

一个类应该只有一个引起它变化的原因,应该只有一个功能。如果一个类有一个以上的功能,这些职责就耦合在了一起,从而导致脆弱的设计。当其中一个功能发生变化时,可能会影响到其它的功能。另外,多个功能耦合在一起,也会影响复用性。如果想要避免这种现象的发生,就应该尽可能的遵守单一功能原则,核心就是解耦和增强内聚性。

二、开闭原则

(Open Close Principle)

开闭原则也就是对扩展开放,对修改关闭。开闭原则是面向对象设计中“可复用设计”的基石。在程序需要进行拓展的时候,不能去修改原有的代码,应该实现一个热插拔的效果。软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。

实现开闭原则的关键在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。

三、里氏代换原则

(Liskov Substitution Principle)

派生类(子类)对象能够替换其基类(超类)对象被使用。也就是任何基类可以出现的地方,其子类一定可以出现。里氏替换原则是继承和复用的基石,只有当衍生类可以替换掉基类,而软件单位的功能不受到影响时,基类才能真正的被复用,而衍生类也能够在基类的基础上增加新的行为。

四、接口隔离原则

(Interface Segregation Principle)

客户端不应该被迫依赖于它所不使用的方法。一个类对另外一个类的依赖性应当是建立在最小的接口上的,而不应当将不同的角色都交给一个接口。应该避免将没有关系的接口合并在一起,形成一个臃肿的大接口。接口隔离的过程也就是一个解耦的过程,使得系统更容易重构,更改和重新部署。

五、依赖反转原则

(Dependence Inversion Principle)

高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。简单来说就是程序要依赖于抽象接口,不要依赖于具体实现。要对抽象进行编程,不要对实现进行编程,进而降低客户与实现模块间的耦合。

图1中,高层对象A依赖于底层对象B的实现;图2中,把高层对象A对底层对象的需求抽象为一个接口A,底层对象B实现了接口A,这就是依赖反转。图片来源:维基百科

依赖反转原则的目的是把高层次组件从对低层次组件的依赖中解耦出来,这样使得重用不同层级的组件实现变得可能。把高层组件和低层组件划分到不同的包/库(在这些包/库中拥有定义了高层组件所必须的行为和服务的接口,并且存在高层组件的包)中的方式促进了这种解耦。由于低层组件是对高层组件接口的具体实现,因此低层组件包的编译是依赖于高层组件的,这颠倒了传统的依赖关系。众多的设计模式,比如插件,服务定位器或者依赖反转,则被用来在运行时把指定的低层组件实现提供给高层组件。

评论一下...

电子邮件地址不会被公开。 必填项已用*标注