主页

索引

模块索引

搜索页面

重构手段-解耦

对于大型重构来说,最有效的一个手段,那就是 “解耦”。解耦的目的是实现代码高内聚、松耦合。

解耦的重要性

备注

软件设计与开发最重要的工作之一就是应对复杂性。人处理复杂性的能力是有限的。过于复杂的代码往往在可读性、可维护性上都不友好。控制代码的复杂性最关键的就是解耦,保证代码松耦合、高内聚。

重构是保证代码质量不至于腐化到无可救药地步的有效手段,那么利用解耦的方法对代码重构,就是保证代码不至于复杂到无法控制的有效手段。

代码 “高内聚、松耦合”的作用:

意味着,代码结构清晰、分层和模块化合理、依赖关系简单、模块或类之间的耦合小,那代码整体的质量就不会差
即便某个具体的类或者模块设计得不怎么合理,代码质量不怎么高,影响的范围是非常有限的。
我们可以聚焦于这个模块或者类,做相应的小型重构。
而相对于代码结构的调整,这种改动范围比较集中的小型重构的难度就容易多了。

判断代码是否符合高内聚/松耦合

衡量标准:

1. 看修改代码会不会牵一发而动全身
2. 把模块与模块之间、类与类之间的依赖关系画出来,根据依赖关系图的复杂性来判断是否需要解耦重构。
    在阅读源码的时候经常会用到的
    如果依赖关系复杂、混乱,那从代码结构上来讲,可读性和可维护性肯定不是太好,
    那我们就需要考虑是否可以通过解耦的方法,让依赖关系变得清晰、简单。

    当然,这种判断还是有比较强的主观色彩,但是可以作为一种参考和梳理依赖的手段,配合间接的衡量标准一块来使用。

如何给代码解耦

  1. 封装与抽象:

    封装和抽象可以有效地隐藏实现的复杂性,隔离实现的易变性,
    给依赖的模块提供稳定且易用的抽象接口。
    
  2. 中间层:

    引入中间层能简化模块或类之间的依赖关系
    
    在进行重构的时候,引入中间层可以起到过渡的作用,能够让开发和重构同步进行,不互相干扰
    a. 引入一个中间层,包裹老的接口,提供新的接口定义
    b. 新开发的代码依赖中间层提供的新接口
    c. 将依赖老接口的代码改为调用新接口
    d. 确保所有的代码都调用新接口之后,删除掉老的接口
    
  3. 模块化:

    模块化是构建复杂系统常用的手段。
    对于一个大型复杂系统来说,没有人能掌控所有的细节。
    将系统划分成各个独立的模块,让不同的人负责不同的模块,
    这样即便在不了解全部细节的情况下,管理者也能协调各个模块,让整个系统有效运转。
    
    合理地划分模块能有效地解耦代码,提高代码的可读性和可维护性。
    所以,我们在开发代码的时候,一定要有模块化意识,
    将每个模块都当作一个独立的 lib 一样来开发,
    只提供封装了内部实现细节的接口给其他模块使用,这样可以减少不同模块之间的耦合度。
    
    模块化的思想无处不在,
    像 SOA、微服务、lib 库、系统内模块划分,甚至是类、函数的设计,都体现了模块化思想。
    如果追本溯源,模块化思想更加本质的东西就是分而治之。
    

其他的设计思想与原则:

1. 单一职责原则
2. 基于接口而非实现编程
3. 依赖注入
4. 多用组合少用继承
5. 迪米特法则

主页

索引

模块索引

搜索页面