为什么要学习设计模式
- 为了容易扩展
- 为了容易阅读
- 阅读其他框架的源码更容易
设计原则
- SRP 单一职责原则
- OCP 开闭原则
- LSP 里式替换原则
- ISP 接口隔离原则
- DIP 依赖倒置原则
- DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
SRP 单一职责原则
- 类的功能单一
一个类只负责完成一个职责或者功能。也就是说,不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类包含了两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。
- 函数功能单一
1个函数尽量描述一件事;函数命名、注释要完整;不要一个函数写几十行的代码,看不懂
OCP 开闭原则
- 对扩展开放,对修改关闭
设计的时候,考虑变化点。写骨架,将不变的东西封装(经典案例:使用策略模式) 代码写的杂乱,单测也不容易写
LSP 里式替换原则
子类能代替父类,并且保证不影响原来的程序。
案例:接口添加登录的校验功能
子类重写父类的方法,如果传输账号、密码 则校验,不传输则不校验(符合里氏替换) 如果写成了账号、密码必传,则不符合里氏替换(因为子类影响了原来的功能,,其他模块使用该方法时,没有传账号密码会报错)
多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。
ISP 接口隔离原则
客户端不应该被强迫依赖它不需要的接口
DIP 依赖倒置原则
高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。
框架提供一个可扩展的代码骨架,用来组装对象、管理整个执行流程。程序员利用框架进行开发的时候,只需要往预留的扩展点上,添加跟自己业务相关的代码,就可以利用框架来驱动整个程序流程的执行。
如何提高代码复用性
- 语义、入参、出参 一致的,应当只写1个函数,而不是改个方法名,再写一遍
- 语义不同,仅仅是因为业务要求导致的出参、入参、逻辑一致,不能合并成1个方法,否则,后续业务变更,要拆分方法;而且不符合单一职责