设计模式中的设计原则

一:单一职责

单一职责的英文是single Responsibility Principle,缩写为SRP。这个原则的英文描述是这样的:A class or module should have a single responsibility。把它翻译成中文就是:一个类或者模块只负责完成一个职责(或者功能)。

注意,这个原则描述的对象包含两个:一个是类(class),一个是模块(module)。关于这两个概念,有两种理解方式,一种理解是:把模块看做比类更加抽象的概念,类也可以看做模块。另一种理解是:把模块看作比类更加粗粒度的代码块,模块中包含多个类,多个类组成一个模块。

单一职责原则的定义非常简单,也不难理解,一个类只负责完成一个职责或者功能。也就是说不要设计大而全的类,要设计粒度小、功能单一的类,换个角度来讲就是,一个类包含两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。

 

二:开闭原则

开闭原则的英文全称是Open Closed Principle,简写为OCP。它的英文描述是:software entities(module,classes,function,etc)should be open for extension,but closed for modification。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放,对修改关闭”。

开闭原则讲的就是代码的扩展性问题,是判断一段代码是否易拓展的“金标准”。如果某段代码在应对未来需求变化的时候,能够做到“对拓展开放,对修改关闭”,那说明这段代码的拓展性比较好。所以,问如何才能做到“对拓展开放,对修改关闭”,也就粗略的等同于问,如何才能写出拓展性好的代码。

为了尽量写出拓展性好的代码,我们要时刻具备拓展意识、抽象意识、封装意识。这些潜意识可能比任何开发技巧都重要。

在写代码的时候,我们要多花点时间往前多思考一下,这些代码未来可能有哪些需求变更、如何设计代码结构,事先留好拓展点,以便未来需求变更的时候,不需要改动代码整体结构、做到最小代码改动的情况下,新的代码能够灵活的插入到拓展点上,做到“对拓展开放、对修改关闭”。

还有在是识别出代码可变部分和不可变部分之后,我们要将可变部分封装起来,隔离变化,提供抽象化的不可变接口,给上层系统调用。当具体的实现发生改变的时候,我们只需要基于相同的抽象接口,拓展一个新的实现,替换掉老的实现即可,上游系统的代码几乎不需要修改。

 

 三:里式替换原则

里式替换原则的英文:Liskov Substitution Principle,缩写为LSP。If S is subtype of T,then objects of type T may be replaced with objects of type S,without break the program.或者: Functions that use pointer of references to base classes must be able to user objects of derived classes without knowing it。将这两条原则用中文描述是这样的:子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。

多态和里式替换有点类似,但他们关注的角度是一样的。多态是面向对象的一大特性,也是面向对象编程语言的一种语法,它是一种代码实现的思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

子类在设计的时候,要准守父类的行为约定。父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定。这里的行为约定包含:函数声明要实现的功能;对输入 输出 异常的约定;甚至包括注释中所罗列的任何特殊情况说明。实际上,定义中父类和子类的关系,也可以替换成接口和实现类之间的关系。

 

四:接口隔离

接口隔离原则的英文翻译是:Interface Segregation Principle,缩写为ISP。Client should not be forced to depend upon inteface.中文就是:客户端不应该强迫依赖它不需要的接口。其中客户端,可以理解为接口的调用者或者使用者。

如果把“接口”理解为一组接口集合,可以是某个微服务的接口,也可以是某个类库的接口等。如果部分接口只被部分调用者使用,我们就需要将这部分接口隔离出来,单独给这部分调用者使用,而不强迫其他调用者也依赖这部分不会被调用到的接口。

如果把“接口”理解为单个API接口或函数,部分调用者只需要函数中的部分功能,那我们就需要把函数拆分成粒度更细的多个函数,让调用者只依赖它需要的那个细粒度函数。

如果把“接口”理解为OOP中的接口,也可以理解为面向对象编程语言中的接口语法。那接口的设计要尽量单一,不要让接口的实现类和调用者,依赖不需要的接口函数。

 

五:依赖倒置

英文描述:High-level modules shouldn’t depend on low-level modules.Both modules should depend on abstractions. In addition,abstracts shouldn’t depend on details.Details depend on abstraction.大概意思就是:高层模块不要依赖底层模块。高层模块和底层模块应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。

依赖注入:是一种具体的编程技巧,我们不通过new的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类来使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值