重构手段-解耦¶
对于大型重构来说,最有效的一个手段,那就是 “解耦”。解耦的目的是实现代码高内聚、松耦合。
解耦的重要性¶
备注
软件设计与开发最重要的工作之一就是应对复杂性。人处理复杂性的能力是有限的。过于复杂的代码往往在可读性、可维护性上都不友好。控制代码的复杂性最关键的就是解耦,保证代码松耦合、高内聚。
重构是保证代码质量不至于腐化到无可救药地步的有效手段,那么利用解耦的方法对代码重构,就是保证代码不至于复杂到无法控制的有效手段。
代码 “高内聚、松耦合”的作用:
意味着,代码结构清晰、分层和模块化合理、依赖关系简单、模块或类之间的耦合小,那代码整体的质量就不会差
即便某个具体的类或者模块设计得不怎么合理,代码质量不怎么高,影响的范围是非常有限的。
我们可以聚焦于这个模块或者类,做相应的小型重构。
而相对于代码结构的调整,这种改动范围比较集中的小型重构的难度就容易多了。
判断代码是否符合高内聚/松耦合¶
衡量标准:
1. 看修改代码会不会牵一发而动全身
2. 把模块与模块之间、类与类之间的依赖关系画出来,根据依赖关系图的复杂性来判断是否需要解耦重构。
在阅读源码的时候经常会用到的
如果依赖关系复杂、混乱,那从代码结构上来讲,可读性和可维护性肯定不是太好,
那我们就需要考虑是否可以通过解耦的方法,让依赖关系变得清晰、简单。
当然,这种判断还是有比较强的主观色彩,但是可以作为一种参考和梳理依赖的手段,配合间接的衡量标准一块来使用。
如何给代码解耦¶
封装与抽象:
封装和抽象可以有效地隐藏实现的复杂性,隔离实现的易变性, 给依赖的模块提供稳定且易用的抽象接口。
中间层:
引入中间层能简化模块或类之间的依赖关系 在进行重构的时候,引入中间层可以起到过渡的作用,能够让开发和重构同步进行,不互相干扰 a. 引入一个中间层,包裹老的接口,提供新的接口定义 b. 新开发的代码依赖中间层提供的新接口 c. 将依赖老接口的代码改为调用新接口 d. 确保所有的代码都调用新接口之后,删除掉老的接口
模块化:
模块化是构建复杂系统常用的手段。 对于一个大型复杂系统来说,没有人能掌控所有的细节。 将系统划分成各个独立的模块,让不同的人负责不同的模块, 这样即便在不了解全部细节的情况下,管理者也能协调各个模块,让整个系统有效运转。 合理地划分模块能有效地解耦代码,提高代码的可读性和可维护性。 所以,我们在开发代码的时候,一定要有模块化意识, 将每个模块都当作一个独立的 lib 一样来开发, 只提供封装了内部实现细节的接口给其他模块使用,这样可以减少不同模块之间的耦合度。 模块化的思想无处不在, 像 SOA、微服务、lib 库、系统内模块划分,甚至是类、函数的设计,都体现了模块化思想。 如果追本溯源,模块化思想更加本质的东西就是分而治之。
其他的设计思想与原则:
1. 单一职责原则
2. 基于接口而非实现编程
3. 依赖注入
4. 多用组合少用继承
5. 迪米特法则