11、SOLID原则

应用设计原则和设计模式,最终的目的还是提高代码的可读性、可扩展性、复用性、可维护性等,故我们在考虑应用某一个设计原则是否合理的时候,需以此作为最终的考量标准。

一、SRP-单一职责原则

一个类或者模块只负责完成一个职责(或者功能)。

通过避免设计大而全的类,避免将不相关的功能耦合在一起,来提高类的内聚性。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性。
另外如果拆分的过细,则会降低内聚性,也会影响代码的可读性。对于接口,我们在设计的时候、要做到单一,但是对于实现类就需要多方面考虑。

判断类的职责是否单一

不能脱离具体的应用场景,不同的应用场景、不同阶段的需求背景、不同的业务层面视角下,对一个类是否满足单一职责原则的判断是不一样的。
开发过程中我们可以先写一个粗粒度的类,满足业务需求。随着业务发展,视具体情况拆分成几个更细粒度的类,此即持续重构。

常用的判断原则:

类的属性或函数过多、代码行数过多,如类长度不超过200行,属性不超过10个,不然影响可读性、可维护性。
依赖的其他类过多,或者依赖类的其他类过多,不符合高内聚低耦合。
类中大量的方法都是集中操作某几个属性。
很难用一个业务名词给类起一个合适的名字。
私有方法过多,看是否可提取复用。

二、OCP-开闭原则

开闭原则是SOLID原则中最基础、最重要、最有用的一条:大多数设计模式都是为了解决代码的扩展性问题,主要遵循的就是开闭原则,开闭原则讲的就是代码的扩展性问题。

理解开闭原则:

软件实体(模块、类、方法等)应该“对扩展开发、对修改关闭”。即添加一个新的功能时,应该在已有的代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。
即以最小的修改代码的代价来完成新功能的开发,让最核心、最复杂的那部分逻辑代码满足开闭原则。

如何应用开闭原则:

1、要时刻具备扩展意识、抽象意识、封装意识;考虑未来的需求变化,设计好代码结构,留好扩展点;识别可变部分和不可变部分,隔离变化,提供抽象化的不可变接口。
2、多态、基于接口而非实现编程、依赖注入、大部分设计模式

三、LSP-里氏替换原则

子类对象能够替换程序中父类对象出现的任何地方,并且保证原来的逻辑行为不变及正确性不被破坏。

多态与里氏替换:

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

一些违背LSP的情况:

1、子类违背父类声明要实现的功能,改变了原有程序的逻辑或破坏了原有程序的正确性。
2、子类违背父类对输入、输出、异常的约定。
3、子类违背父类注释中罗列的任何特殊说明。

四、ISP-接口隔离原则

客户端(接口的调用者或使用者)不应该被强迫依赖它不需要的接口。接口有三种理解:
一组API接口集合:如果部分接口只被部分调用者调用,那我们就将这部分接口隔离出来。
单个API接口或函数:结合具体场景,函数的功能要单一,不同的功能逻辑不要放在一个函数里。
OOP中的接口概念:如Java中的interface,那么接口的设计要尽量单一,不要让接口的实现类和调用者,依赖不需要的接口函数。

ISP与SRP的区别:

SRP针对的是模块、类、方法的设计。ISP侧重接口的设计,从另一个角度指导接口设计:即通过调用者如何使用接口来间接地判定接口是否职责单一,如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。

五、DIP-依赖反转(依赖倒置)原则

高层(调用者)模块不依赖低层(被调用者)模块,它们共同依赖同一个抽象。另外抽象不依赖具体实现细节,具体实现细节依赖抽象。
在Java中即模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过依赖接口或抽象类产生的。接口或抽象类不依赖于实现类,实现类依赖接口或抽象类。

控制反转(IOC):

控制反转并不是一种具体的实现技巧,而是一种设计思想,一般用来指导框架层面的设计。这里所说的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程通过框架来控制。流程的控制权从程序员“反转”给了框架。

依赖注入(DI):

依赖注入是一种具体的编程技巧。即不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。
依赖注入是编写可测试代码最有效的手段。

依赖注入框架(DI Framework):

对象创建和依赖注入的工作,本身和具体的业务无关,我们可以抽象成框架来自动完成,即依赖注入框架,如Java Spring。
我们只需要通过框架提供的扩展点,配置一下所有需要创建的类对象、类与类之间的依赖关系,就可以实现由框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值