纲要
KISS原则
Keep It Simple and Stupid
尽量保持简单
代码行数越少就越“简单”吗?
答案是否定的,实现逻辑需要简单,易维护,不过度优化
代码逻辑复杂就违背 Kiss 原则吗?
答案也是否定的,需要考虑逻辑复杂度,实现难度,可代码的可读性。
总结
- 不要使用很另类的技术实现代码
- 不要重复造轮子,善于使用已有的工具类库
- 不要过度优化
一句话:KISS原则讲”如何做“的问题(尽量保持简单)
tip: 在开发中不要过度设计,越是能用简单的方法解决复杂的问题,越能体现一个人的能力。
YAGNI原则
You Ain’t Gonna Need It
你不会需要它
核心思想:不要做过度设计。
一句话:YAGNI原则讲”要不要做“的问题(当前不需要的就不要做)
DRY原则
Don’t Repeat Yourself
不要重复自己,即不要写重复的代码。
三种典型的代码重复情况:
- 实现逻辑重复
- 实现逻辑重复,但功能语义不重复的代码,并不违反DRY原则。
- 功能语义重复
- 实现逻辑不重复,但功能语义重复的代码,也算是违反DRY原则。
- 代码执行重复
- 重复执行相同的代码也是违反DRY原则。
代码复用性
三个不同的概念:
- 代码复用性(Code Reusability)
- 表示一段代码可被复用的特性或能力
- 代码复用(Code Resue)
- 尽量复用已经存在的代码
- DRY原则(Don’t Repeat Yourself)
- 不要写重复的代码
复用和可复用性关注角度不同
“可复用性”是从代码开发者的角度出发的。
“复用”是从代码使用者的角度出发的。
实际上目的是一样的,都是为了减少代码量,提高代码可读性,可维护性。
提高复用性方法
- 减少代码耦合
- 高度耦合的代码,往往是牵一发而动全身。
- 尽量减少代码耦合,提高代码的复用性。
- 满足单一职责原则
- 模块,类,函数尽量职责单一。
- 越细粒度的代码,代码的通用性会越好,越容易被复用。
- 模块化
- 类, 函数要尽量将独立的功能封装成模块。
- 独立的模块像一块一块积木,更加容易复用,可以直接拿来搭建更加复杂的系统。
- 业务与非业务逻辑分离
- 越是跟业务无关的代码越是容易复用。
- 越是针对特定业务的代码越难复用。
- 为了复用跟业务无关的代码,将业务与非业务逻辑代码分离,抽取成一些通用的框架,类库,组件等
- 通用代码下沉
- 从分层的角度来看,越底层的代码越通用,会被越多模块调用,越应该设计得足够可复用。
- 避免交叉调用导致关系混乱
- 只允许上层代码调用下层代码及同层代码之间调用。
- 杜绝下层代码调用上层代码。
- 通用的代码尽量下沉到更下层。
- 继承,多态,抽象,封装
- 利用继承:可以将公共的代码抽取到父类,子类复用父类的属性和方法。
- 利用多态:动态地替换一段代码的部分逻辑,让这段代码可复用。
- 利用抽象:越抽象,越不依赖具体实现,越容易复用。
- 利用封装:代码封装模块,隐藏可变的细节,暴露不变的接口,就越容易复用。
- 应用模板等设计模式
- 使用设计模式,提高代码复用性。
- 其它
- 泛型编程,也是提高代码复用性。
- 复用意识非常重要,时常要多去思考一下,这部分代码是否可以抽取出来,作为一个独立的模块,类或函数供多处使用。
- 设计每个模块,类,函数的时候,要像设计一个外部API一样,去思考它的复用性。
LOD原则
Low of Demeter
最少知道原则。
每个模块只应该了解那些与它关系密切的模块的有限知识,或者说,每个模块只和自己的朋友“说话”,不和陌生人“说话”。
从类的角度描述:不该有直接依赖关系的类之间,不要有依赖; 有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中“有限知识)。
何为“高内聚,松耦合”
**一句话:**高内聚用来指导类本身的设计,松耦合用来指导类与类之间依赖关系的设计。
- “高内聚,松耦合是一个非常重要的设计思想,能够有效地提高代码可读性和可维护性,缩小功能改动导致的代码改动范围。
- “高内聚,松耦合”是一个比较通用的设计思想,可以用来指导不同粒度代码的设计与开发,如系统,模块,类和函数。也可以应用不同开发场景,如微服务,框架,组件,类库等。
tip: 如单一职责原则,基于接口而非实现编程都是实现“高内聚,松耦合”的目的。
如何理解“高内聚”,松耦合“
- “高内聚,松耦合”是一个非常重要的设计思想,能够有效提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。
- 高内聚:用来指导类本身的设计。
- 松耦合:用来指导类与类之间依赖关系的设计。
- 所谓高内聚:就是指相近的功能应该放到同一个类中,不相近的功能不要放到同一类中。相近的功能往往被同时修改,放到同一个类中,修改会比较集中。
- 所谓松耦合:就是指在代码中,类与类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的代码改动也不会或者很少导致依赖类的代码改动。
如何理解“迪米特法则”
- 不该有直接依赖关系的类之间,不要有依赖。
- 有依赖关系的类之间,尽量只依赖必要的接口。
- 迪米特法则只希望减少类之间的耦合,让类越独立越好。
- 每个类都应该少了解系统其它部分。
- 一旦发生变化,需要了解这一变化的类就会比较少。
不同原则角度出发不同,最终都是写出扩展性,可维护性,可阅读性的好代码。
- 高内聚,松耦合
- 基于设计思想考量
- 单一职责原则
- 基于自身提供的功能考量
- 接口隔离原则
- 基于外部关系上只依赖需要的抽象考量
- 基于接口而非实现编程
- 基于使用者考量
- 迪米特法则
- 基于关系考量