设计模式 - 开篇 (2)

  里氏替换原则(LSP)声明:所有引用基类的地方必须能使用其子类的对象。也就是说任何基类可以被调用的地方,子类也一定可以被调用。

  在软件开发过程中,只有当子类替换掉父类后,此时软件的功能不受影响时,父类才能真正地被复用,而子类也可以在父类的基础上添加新的行为。举个例子:我喜欢运动,那能推断出我一定喜欢跑步,因为跑步是运动的一种;但是从我喜欢跑步却不能推断我喜欢运动,因为我并不喜欢蹦极,虽然它也是运动的一种。

  ISP - 接口分离原则

  接口分离原则:使用多个专门的接口比使用单一的总接口要好也就是说不要让一个单一的接口承担过多的职责,而应把每个职责分离到多个专门的接口中,进行接口分离。

  我们应该都有这样的经历,在一个大的业务类型接口中,定义了非常多的方法,当业务需要在该接口添加新方法时,所有实现该接口的类都要去实现该方法,这样就会导致即使我负责的业务跟你新加的方法没有太大关系,我也得去实现你的方法,并且由于需要实现新的方法,导致客户端会暴露这个方法。

  根据接口分离原则,推荐的实现的方式应该是:把大的接口拆分,让大类实现多个更小的接口,根据用途对功能进行分组。依赖关系与那些相关联用于松耦合,增加健壮性,灵活性以及可复用性。我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口分离原则,灵活性较差,使用起来很不方便。

  那这个度是如何控制的呢?这里有一个准则是,基于客户端需要的用途对功能进行分组,仅仅提供客户端需要的行为,不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。

  我们能看出这是SRP的延伸,所以重构的过程中,可以结合接口隔离原则和单一职责原则进行代码重构。

  DIP - 依赖倒置原则

  先说一下这个依赖关系是什么。

  在实际的开发过程中,我们很多人总是倾向于创建一些高层模块依赖于低层模块的开发策略,因为是低层次提供了对外的接口,高层次只能依赖于低层次所提供的接口,所以这个依赖关系应该是高层依赖于底层。
  如何理解高层次和低层次?通俗点说:当A需要用到B时,那A就是高层次,B就是低层次。很明显,如果设计了这些高层模块依赖于低层模块,那么对低层模块的改动就会直接影响到高层模块,从而迫使它们需要作出改动,高层将没有任何的自主性。

  如何去除这样的关系?依赖倒置原则提倡的是:高层模块不应该依赖于低层模块,至此我们应该知道了这个倒置的含义,应该是解除高层和底层的直接耦合关系。很明显,去除这层关系是对的,但如何实现呢?

  依赖倒置的原则是:依赖抽象,不依赖具体实现,也就是高层和底层的耦合关系通过抽象(接口)来实现。这也是我们提倡的面向接口编程,与之相关的概念是DI(依赖注入)和IoC(控制反转)。

  该原则规定了在类之间存在依赖关系的情况下,应使用抽象(如接口)来构建它们的耦合关系,而不是直接引用类。 这减少了由低层次模块的变化而导致高层模块的改动。

 

   后记  

  通常我们接手一个依赖关系很糟糕的项目要进行重构时,你会发现里面代码可能会混乱,脆弱且难以重用。在这过程中我们势必要改变现有功能或添加新的功能,而这样的代码会让我们维护的过程变得举步维艰。脆弱的代码很容易造成bug的产生,常见的情况是你一个区域的代码发生变化时候,造成你其他模块出现bug。如果你遵从SOLID原则,那么你可以编写出更灵活更健壮的代码,并且具有更高的重用性。  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzpy.html