AlphaWang.com

Alpha's Programming Notes | 一个程序员的日常

[六大设计原则] 4. Interface Segrefation Principle

定义

Interface Segregation Principle:

  • Clients should not be forced to depend upon interfaces that they don’t use.

    客户端只依赖于它所需要的接口;它需要什么接口就提供什么接口,把不需要的接口剔除掉。

  • The dependency of one class to another one should depend on the smallest possible interface.

    类间的依赖关系应建立在最小的接口上。
    即,接口尽量细化,接口中的方法尽量少

问题由来

A通过接口I依赖类B,类C通过接口I依赖类D。如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

[六大设计原则] 3. Dependence Inversion Principle

定义

DIP,Dependence Inversion Principle:

  • High level modules should not depend upon low level modules. Both should depend upon abstractions.
  • Abstractions should not depend upon details. Details should depend upon abstractions.

即“面向接口编程”:

  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;

    模块间的依赖通过抽象发生。实现类之间不发生直接的依赖关系(eg. 类B被用作类A的方法中的参数),其依赖关系是通过接口或抽象类产生的;

  • 抽象不应该依赖细节;

    接口或抽象类不依赖于实现类

  • 细节应该依赖抽象;

    实现类依赖接口或抽象类

      **何为“倒置”?**  
      依赖正置:类间的依赖是实实在在的实现类间的依赖,即面向实现编程,这是正常人的思维方式;     
      而依赖倒置是对现实世界进行抽象,产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖。
    

[六大设计原则] 2. Liskov Substitution Principle

定义

LSP,Liskov Substitution Principle:

  • If for each object s of type S, there is an object t of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when s is substituted for t when S is a subtype of T.
  • Functions that use pointers or references to base classes must be able to user objects of derived classes without knowing it.

    所有引用基类的地方,都能透明地替换成其子类对象。只要父类能出现的地方,子类就可以出现。

里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

问题由来

引入里氏替换原则能充分发挥继承的优点、减少继承的弊端。

[六大设计原则] 1. Single Responsibility Principle

定义

SRP,Single Responsibility Principle:

  • There should never be more than one reason for a class to change.

    应该有且仅有一个原因引起类的变更。(如果类需要变更,那么只可能仅由某一个原因引起)

问题由来

类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

解决方案

遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。