一、单一职责原则SRP
SRP:Single Responsibility Principle
定义:There should never be more than one reason for a class to change。(应该有且仅有一个原因引起类的变更。)
个人理解:尽量将业务和技术拆的单一,避免相互影响。设计时需要明确每一个类是做什么的,不要在一个类或模块中做多件事,一个类中可能会做一个模块的多件事,此时,单一职责原则可以在方法中体现。例如,计算机中,CPU只需要负责完成CPU需要完成的工作,而不需要负责键盘和鼠标完成的工作。如果CPU有一天进化了,
优点:
1.降低了复杂度,易于维护
2.提高了可读性
3.避免不相关的代码改动影响了当前完成的功能
二、里氏替换原则LSP
LSP:Liskov Substitution Principle
定义:多用组合,少用继承
通俗解释:子类可以扩展父类的功能,但不能改变父类原有的功能
个人理解:里氏替换原则主要有以下两种方面:
一是为了共享父类中的方法;二是父类是一个抽象类,其中的抽象方法需要在子类中实现,实例化子类对象调用该方法;
在第一种情况下,共享出来的方法就不应该在子类中被重写,否则就失去了想用子类的实例化对象调用父类方法的初心,但是此时子类可以进行扩展,创建一些属于自己的方法,第二种情况下,抽象类是不能实例化的,所以此时必须使用子类对象调用父类中的方法。
里氏替换原则的最终目的是为了实现所有使用父类实例化对象的地方都能使用子类实例化对象替换。
优点:
1.避免子类代码的改动影响到父类中已经完善的功能
2.提高继承体系的可复用性
3.在多态使用的场景下,降低出错的概率
三、依赖倒置原则DIP
DIP:Dependency Inversion Principle
定义:上层模块不应该依赖底层模块,它们都应该依赖于抽象
个人理解:
在微服务的架构里,层次划分为:
SDK/api层:此层封装了给第三方调用的接口,特点是小,不必要的包不放在该层
web/controller层:主要与前端进行交互,springboot的启动类在这层,需要依赖application层
application层:应用层 进行所有的业务操作,依赖domain层
domain层:领域层 不依赖infrastructure层
infrastruture层:基础设施层 与DB、sql、nosql、rpc远程第三方接口 连接 依赖domain层
按照层次划分,从上往下进行依赖调用,但是在domain层和infrastruture层进行依赖倒置,在domain层中提供接口,在infrastructure层中进行实现,这样的好处是当数据库或第三方发生变化时,只需要修改infrastructure层,而不需要进行domain层及其他层的配套修改。
优点:
1.降低代码耦合度
2.提高代码扩展性
3.降低影响范围
四、接口隔离原则ISP
ISP:Interface Segregation Principle
定义:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中方法尽量少。
个人理解:建立接口时应当注意,不要将其他无关的方法放入该接口中,这就表示需要满足单一职责原则。需要注意的是接口粒度也不能过小,过小会导致接口数量过多,提高设计复杂度,这个界限就需要靠经验来判断;同时需要减少对外的交互,提高接口的处理能力;为依赖接口的类提供定制化的服务,只给调用接口的类提供它需要的方法,将它不需要的方法隐藏起来。
优点:
1.提高接口内聚性
2.提供定制化服务
五、迪米特法则/最少知识原则LoD
LoD:Law of Demeter
定义:talk only to your immediate friends
个人理解:迪米特法则说的是只跟你的密友谈话。那么什么是密友呢?出现在成员变量、方法的输入输出参数中的类被称为成员朋友类;另外,朋友的朋友不是朋友。
例如:想查看图书馆里的《大话设计模块》中的第二章,那就得先去图书馆,然后找到《大话设计模式》,然后找到第二章,在这个场景下,图书馆和《大话》是有关系的,《大话》和书中的第二章是有关系的,但是图书馆和书中的第二章是没有关系的,图书馆也不需要知道第二章,这就符合迪米特法则。
优点:
1.只需要对自己模块负责,职责划分清晰
2.高内聚,低耦合
六、开闭原则OCP
OCP:Open Close Principle
定义:对修改关闭,对扩展开放
个人理解:一个士兵需要一把枪,如果直接在士兵类中给定使用的是AK47,那么,如果后续枪类型发生了变化,这个时候只能修改代码,就违背了开闭原则,正确的方式应该是在士兵类中给枪的接口,在调用处指定使用的枪是什么
优点:
1.提高复用性
2.易于维护
**************此文章只是本人学习过程中的学习笔记,不做其他用途,如果有其他意见,欢迎一起讨论,谢谢,侵删*************************