美文网首页
如何解耦代码

如何解耦代码

作者: NeXt4 | 来源:发表于2020-12-20 17:48 被阅读0次

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

    “高内聚、松耦合”的特性可以让我们聚焦在某一模块或类中,不需要了解太多其他模块或类的代码,让我们的焦点不至于过于发散,降低了阅读和修改代码的难度。而且,因为依赖关系简单,耦合小,修改代码不至于牵一发而动全身,代码改动比较集中,引入 bug 的风险也就减少了很多。同时,“高内聚、松耦合”的代码可测试性也更加好,容易 mock 或者很少需要 mock 外部依赖的模块或者类。

    如何判断代码是否解耦
    把模块与模块之间、类与类之间的依赖关系画出来,根据依赖关系图的复杂性来判断是否需要解耦重构。

    如果依赖关系复杂、混乱,那从代码结构上来讲,可读性和可维护性肯定不是太好,那我们就需要考虑是否可以通过解耦的方法,让依赖关系变得清晰、简单。当然,这种判断还是有比较强的主观色彩,但是可以作为一种参考和梳理依赖的手段,配合间接的衡量标准一块来使用。

    如何实现解耦

    1. 封装与抽象

    2. 中间层

    3. 模块化
      合理地划分模块能有效地解耦代码,每个模块之间的耦合很小,提高代码的可读性和可维护性。
      模块化思想更加本质的东西就是分而治之。

    4. 其他设计思想和原则
      “高内聚、松耦合”是一个非常重要的设计思想,能够有效提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。

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

    迪米特法则的英文翻译是:Law of Demeter,缩写是 LOD。
    单从这个名字上来看,我们完全猜不出这个原则讲的是什么。不过,它还有另外一个更加达意的名字,叫作最小知识原则,英文翻译为:The Least Knowledge Principle。
    关于这个设计原则,我们先来看一下它最原汁原味的英文定义:

    Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.

    翻译过来就是:
    每个模块(unit)只应该了解那些与它关系密切的模块(units: only units “closely” related to the current unit)的有限知识(knowledge)。或者说,每个模块只和自己的朋友“说话”(talk),不和陌生人“说话”(talk)。

    不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中的“有限知识”)。

    1. 一些常用的解耦的手段
      Spring AOP,实现业务代码与非业务代码的解耦
      IoC, 实现对象使用者与对象创建者解耦
      Spring中的事件监听机制
      消息队列,实现了观察者和被观察者的解耦

    《极客时间 - 设计模式之美》

    相关文章

      网友评论

          本文标题:如何解耦代码

          本文链接:https://www.haomeiwen.com/subject/vbuknktx.html