西安学校网站建设报价,wordpress 怎么上传到空间,营销推广费用方案,wordpress 插件 备忘录文章目录 一. “解耦”概述二. 如何给代码“解耦”#xff1f;1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用#xff0c;能够让开发和重构同步进行#xff0c;不互相干扰。 3. 模块化4. 其他设计思想和原则4.… 文章目录 一. “解耦”概述二. 如何给代码“解耦”1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用能够让开发和重构同步进行不互相干扰。 3. 模块化4. 其他设计思想和原则4.1. 单一职责原则4.2. 基于接口而非实现编程4.3. 依赖注入4.4. 多用组合少用继承4.5. 迪米特法则 一. “解耦”概述
重构可以分为大规模高层重构简称“大型重构”和小规模低层次重构简称“小型重构”。 通过解耦对代码重构就是保证代码不至于复杂到无法控制的有效手段。 代码是否需要“解耦” 看修改代码会不会牵一发而动全身。依赖关系是否复杂 把模块与模块之间、类与类之间的依赖关系画出来根据依赖关系图的复杂性来判断是否需要解耦重构。 二. 如何给代码“解耦”
1. 封装与抽象
封装和抽象作为两个非常通用的设计思想可以应用在很多设计场景中比如系统、模块、lib、组件、接口、类等等的设计。封装和抽象可以有效地隐藏实现的复杂性隔离实现的易变性给依赖的模块提供稳定且易用的抽象接口。
比如Unix 系统提供的 open() 文件操作函数我们用起来非常简单但是底层实现却非常复杂涉及权限控制、并发控制、物理存储等等。 我们通过将其封装成一个抽象的 open() 函数能够有效控制代码复杂性的蔓延将复杂性封装在局部代码中。因为 open() 函数基于抽象而非具体的实现来定义所以我们在改动 open() 函数的底层实现的时候并不需要改动依赖它的上层代码也符合我们前面提到的“高内聚、松耦合”代码的评判标准。 2. 中间层
2.1. 引入中间层能简化模块或类之间的依赖关系。 下面这张图是引入中间层前后的依赖关系对比图。在引入数据存储中间层之前A、B、C 三个模块都要依赖内存一级缓存、Redis 二级缓存、DB 持久化存储三个模块。在引入中间层之后三个模块只需要依赖数据存储一个模块即可。 从图上可以看出中间层的引入明显地简化了依赖关系让代码结构更加清晰。 2.2. 引入中间层可以起到过渡的作用能够让开发和重构同步进行不互相干扰。 比如某个接口设计得有问题我们需要修改它的定义同时所有调用这个接口的代码都要做相应的改动。如果新开发的代码也用到这个接口那开发就跟重构冲突了。为了让重构能小步快跑我们可以分下面四个阶段来完成接口的修改。 引入一个中间层包裹老的接口提供新的接口定义。新开发的代码依赖中间层提供的新接口。将依赖老接口的代码改为调用新接口。确保所有的代码都调用新接口之后删除掉老的接口。 这样每个阶段的开发工作量都不会很大都可以在很短的时间内完成。重构跟开发冲突的概率也变小了。 3. 模块化
合理地划分模块能有效地解耦代码提高代码的可读性和可维护性。所以我们在开发代码的时候一定要有模块化意识将每个模块都当作一个独立的 lib 一样来开发只提供封装了内部实现细节的接口给其他模块使用这样可以减少不同模块之间的耦合度。
实际上从刚刚的讲解中我们也可以发现模块化的思想无处不在像 SOA、微服务、lib 库、系统内模块划分甚至是类、函数的设计都体现了模块化思想。 如果追本溯源模块化思想更加本质的东西就是分而治之。 4. 其他设计思想和原则
4.1. 单一职责原则
高内聚会让代码更加松耦合而实现高内聚的重要指导原则就是单一职责原则。模块或者类的职责设计得单一而不是大而全那依赖它的类和它依赖的类就会比较少代码耦合也就相应的降低了。 4.2. 基于接口而非实现编程
基于接口而非实现编程能通过接口这样一个中间层隔离变化和具体的实现。这样做的好处是在有依赖关系的两个模块或类之间一个模块或者类的改动不会影响到另一个模块或类。 实际上这就相当于将一种强依赖关系强耦合解耦为了弱依赖关系弱耦合。 4.3. 依赖注入
跟基于接口而非实现编程思想类似依赖注入也是将代码之间的强耦合变为弱耦合。尽管依赖注入无法将本应该有依赖关系的两个类解耦为没有依赖关系但可以让耦合关系没那么紧密容易做到插拔替换。 4.4. 多用组合少用继承 继承是一种强依赖关系父类与子类高度耦合且这种耦合关系非常脆弱牵一发而动全身父类的每一次改动都会影响所有的子类。组合关系是一种弱依赖关系这种关系更加灵活所以对于继承结构比较复杂的代码利用组合来替换继承也是一种解耦的有效手段。 4.5. 迪米特法则
迪米特法则讲的是不该有直接依赖关系的类之间不要有依赖有依赖关系的类之间尽量只依赖必要的接口。从定义上我们明显可以看出这条原则的目的就是为了实现代码的松耦合。 《设计模式之美》-- 王争