单一职责
- 定义:一个类或者模块只负责完成一个职责。
- 目的:高内聚,低耦合,提高复用性,可读性,可维护性
- 变化:先写一个粗粒度的类,满足需求,后面业务发展,再拆分。
- 如何判定是否单一
- 代码行数、函数、属性过多
- 依赖的其他类过多,或依赖类的其他类过多
- 私有方法过多
- 难于区合适的名字
- 类中大量的方法都在集中操作类中的某几个属性
- 是否越单一越好
- 太单一减少了内聚性
开闭原则
- 定义:添加一个新功能应该是,在已有的代码基础上扩展(新增模块,类,方法等),而非修改已有代码(修改模块,类,方法等)
- 评判标准:不破坏原有代码的正常运行,不破坏原有的单元测试
- 理解:
- 并不是完全杜绝修改,而是以最小的修改完成新功能开发
- 同样的代码,在粗粒度可能为“修改”,在细粒度为“扩展”
- 如何做
- 意识:扩展,抽象,封装
- 可能有哪些变更,事先留好扩展点。
里式替换和多态的区别
- 核心:按照协议来设计,子类和父类逻辑一样
- 里斯替换:是一种设计原则
- 多态:是一种语法
接口隔离
- 定义:客户端不应该被强迫依赖他不需要的接口
- 接口理解:
- 一组API接口集合
- 单个API接口或者函数
- OOP中接口
- 在设计微服务或者类库接口的时候,如果部分几口只被部分调用者使用,那我们旧机房这部分接口隔离出来。
- 接隔离与单一职责区别
- 单一职责:对模块,类,接口
- 接口隔离:侧重接口设计,判断接口职责是否单一的标准。
控制翻转,依赖翻转,依赖注入
- 控制反转
- 控制:对程序执行流程的控制
- 反转:
- 没有使用框架之前,程序员自己控制
- 使用框架:框架控制流程
- 依赖注入:
- 不在类内部创建依赖对象,在外部创建好之后,通过构造函数、函数参数等方式传递给类
- 依赖注入框架
- 对象创建,管理对象生命周期,依赖注入
- 依赖反转
- 高层底层共同依赖抽象
kiss原则,yagni原则
- kiss原则:保持简单
- 不要使用同事可能不懂的技术实现
- 不要重复造轮子
- 不要过度优化
- YAGNI:你不需要它
- 不要去设计当前不需要的功能
DRY:提高代码复用性
- dry
- 实现逻辑重复:逻辑重复,语义不重复-》不重复
- 功能语义重复:实现逻辑不重复,语义重复-》重复
- 代码执行重复:多次执行相同代码-》重复
- 复用性
- 减少代码耦合
- 单一职责:越细粒度的代码通用性越好
- 模块化:功能独立的代码,封装成模块
- 业务非业务逻辑分离:非业务逻辑易复用
- 通用代码下沉:
- 继承、多态、抽象、封装
- 应用模板等设计模式
迪米特实现高内聚低耦合
- 高类聚,低耦合
- 高类聚:相近的功能放在一个类中,不想近的功能不要放在一个类中
- 松耦合:
- 类与类之间依赖关系简单清晰。
- 一个类的代码改动不会或者很少导致依赖代码的改动
- 迪米特
- 不该依赖的类之间不要有依赖
- 有依赖的类之间,尽量只依赖必要的接口
- 实战1:不应该有直接依赖关系的类,不要有依赖
- 只传入需要的数据,(给钱,而不是钱包)
- 基于接口编程
- 不依赖不应该依赖的对象
- 实战二:有依赖关系的类之间,尽量只依赖接口
- 高内聚:功能在一个类中
- 低耦合:通过接口隔离,实现不同功能接口