知识卡片

过度分散的功能、模糊接口与无关的相邻连接件

普通读书笔记卡

内容

除[[连接件嫉妒:组件僭越连接件职责]]外,Garcia等人重点定性描述的另外三种架构坏味道,共同点是都违反了”关注点分离”这一传统软件工程原则、只是违反的方式不同。过度分散的功能:多个组件本该由一个专门组件统一负责的共同关注点(SharedConcern),却被分散实现在了各自的组件里,每个组件在处理自己正交关注点(如ConcernB、ConcernC)的同时还要重复处理这个共享关注点。代价是可维护性下降——共享关注点一旦发生变动,需要同时修改并测试所有涉及的组件,而不是只改一处;同时也牺牲了系统稳定性,因为职责不单一导致组件难以解耦复用。例外情况是:如果这个共享关注点必须依赖多个既有的、不允许修改的固化组件才能完成,那么分散实现反而是无奈但合理的选择,此时不必强求可维护性。模糊接口:组件对外只暴露一个笼统的公共方法,内部却根据传入参数的具体类型(如是否是TextMessage)分岔处理成截然不同的服务逻辑——调用方光看接口签名完全猜不到组件到底提供了哪些服务,必须扒开具体实现才能弄清楚,可分析性和可理解性因此大打折扣;书中还用一个n个组件共享同一事件总线的例子说明模糊、宽泛的接口会放大耦合面:一个发布者服务的改动可能波及n-1个订阅者,而接口定义得越精确,受影响范围就能被限制得越小,工程师排查改动影响时也只需检查真正相关的那部分组件。无关的相邻连接件:架构师为不同的组件间通信选用了不同类型的连接件(如过程调用与事件总线),而这两类连接件各自的优点会相互抵消——过程调用让控制信息传递更明确、依赖更容易追踪,事件连接件让发送方和接收方彼此不必知道对方、从而提升可重用性和适应性,但当同一套架构里两种连接件相邻共存时,往往两头的好处都拿不全,反而互相拖累。这三种坏味道和连接件嫉妒放在一起看,说明架构坏味道大多数时候不是某个组件”写错了”,而是本该分离的职责被以各种具体方式重新粘连在了一起。

参考来源

- 位置:《软件架构理论与实践》第20章《软件架构坏味道》"20.3.1 架构坏味道"第2-4小节(源文件:_epub-src/OEBPS/text00171.html) - 结论依据:原文分别描述三种坏味道的成因与影响,如"组件B和C违反了关注点分离的原则,因为它们都对各自正交关注点负责""仅通过这个公有接口无法获取该组件到底提供了什么样的服务""拥有两个在不同连接件类型下进行通信的架构元素会引发这样的危机:每个独立连接件的积极影响可能会彼此相互抵消",直接支撑本卡片结论。 - 原始内容:越精确的接口通过限制所发布服务的订阅者的数量,可以提升系统的可理解性……过程调用对可理解性有积极作用,因为直接方法调用使得控制信息的传输更加明确……事件连接件提升了可重用性和适应性,因为事件的发送方和接收方在通常情况下都不清楚对方。