知识卡片

架构解耦的定义与GRASP设计模式手段

普通读书笔记卡

内容

耦合度表示模块之间关系的紧密程度,低耦合是软件设计的目标——低耦合模块之间关系尽可能简单、相互依赖性小,也就是松散耦合。解耦就是降低模块间耦合度、让模块间尽可能松散耦合;好的耦合关系要”松散到恰到好处”,使一个模块能很容易被其他模块使用,直接结果是改动和维护成本低、可读性高。高内聚往往伴随低耦合,软件架构组成元素(组件、连接件)彼此依赖关系越少,耦合度越低;如果各组成元素耦合非常紧密,单个元素的改变就会波及更多其他元素,对后期维护改进不利、造成较大开销——因此架构解耦对架构设计和维护而言都是核心、必要的内容。从微观角度,可以通过选择合理的设计模式来解耦,例如通用职责分配模式(GRASP)中的低耦合模式(尽可能减少类之间的连接)和高内聚模式(给类分配内聚的职责)就直接针对这个问题;再如行为型模式中的职责链模式,让多个对象都有机会处理请求,从而避免请求发送者和接收者之间的耦合——把”谁具体处理这个请求”这个决定,从发送者手里转移给一条动态构建的处理链,发送者因此不需要知道最终是谁处理了请求。但书中特别强调,除了这种细节化的设计模式视角,还需要从宏观架构角度考虑解耦:一个结构混乱、组件没有内聚、掺杂大量不必要耦合的松弛而模糊的软件架构,会让每个组件的代码都很难编写好,还会产生大量重复代码——这揭示了一个层级关系:设计模式层面的解耦解决的是局部、类与类之间的问题,而架构层面的解耦解决的是宏观、组件与组件之间的问题,两者互补但不能互相替代,只做局部的设计模式优化,无法弥补宏观架构本身混乱带来的耦合问题。

参考来源

- 位置:《软件架构理论与实践》第18章《软件架构解耦》"18.1 引言"节(源文件:_epub-src/OEBPS/text00145.html) - 结论依据:原文说明"通用的软件职责分配模式(GRASP)中的低耦合模式、高内聚模式就可以解决软件架构解耦的问题……使用职责链模式能够将提交帮助请求的对象与可能提供帮助信息的对象解耦",并说明"一个结构混乱、系统组件没有内聚、掺杂大量没有必要的耦合、松弛而模糊的软件架构将导致很难编写好每个组件代码,而且还会产生很多重复的代码",直接支撑本卡片结论。 - 原始内容:好的耦合关系会松散到恰到好处,使得一个模块能够很容易被其他模块使用,也就是说解耦能够保持组件之间的自主和独立性。它的直接结果就是改动和维护成本低、可读性高。