知识卡片

面向模式的架构重构六种模式

普通读书笔记卡

内容

面向模式的架构重构流程是:输入软件架构图(由项目代码聚类恢复出的架构依赖图),根据软件质量度量结果确定需要提高的质量指标(重构需求),据此选择合适的模式,用模式能阐述的问题制定重构点定位规则,检测到重构点后按模式的解决方案制定重构方案并实施,得到新架构图,再通过重构仿真验证效果。模式选择依据一张”模式-质量指标关联表”:不同模式对不同质量指标的影响方向不同(如分层模式能改善可修改性、可测试性、可替换性,但会导致易理解性下降),当多种模式都能满足度量未达成的需求时,优先选择重构代价最小的模式。重构点定位借鉴设计模式重构点定位的决策树思想,每棵决策树对应一个模式,节点分UnaryNavigationNode(判断结果为true才继续、否则停止查找)、BinaryNavigationNode(无论结果对错都有对应节点继续判断)、DesignPatternNode(叶节点,表示该位置可应用该模式)三类。六种典型模式各自对应不同的架构缺陷形态:分层模式把有相似性的组件(通过扇入扇出关系判断,如都依赖同一组件则视为相似)聚成同一层,靠全排列方式找出”下层不依赖上层”的最合理分层——重构后软件结构清晰、更易修改测试理解替换。正交模式找出没有入度、出度最多的顶层组件(往往是系统入口或主控组件),从它出发做图深度遍历得到多条”线索”(每条线索代表一种独立功能),删除线索间不必要的依赖使线索间正交——重构后项目分成多个独立线索,便于组件替换修改。微内核模式把扇出最多的组件视为核心组件(基础组件),其依赖的组件视为插件,删除插件间的依赖关系——重构后核心组件只提供基础通用功能,插件即插即用,便于扩展升级(Eclipse就是这种模式的典型案例)。整体与部分模式把一个组件拆成一个Whole组件(封装外部访问该组件的接口)和多个独立的Part组件(各自完成部分功能)——重构后外部只能通过Whole组件与内部交互,内部功能被拆解成独立单元。消息总线模式在组件间依赖过于密切时插入一个新的消息总线组件,所有组件交互都改由总线负责接收转发——重构后组件间通过总线通信,方便解耦。数据库模式让所有应用组件只与一个数据库组件交互、删除应用组件间的直接关系——适合需要管理大量持久共享数据的场景,重构后组件间相互独立、都只与数据库交互。六种模式对应六种截然不同的”依赖关系整理方式”:分层是按抽象层次纵向切分,正交是按功能线索横向切分,微内核和消息总线分别用”核心-插件”和”中介总线”两种方式做去中心化解耦,整体与部分是对单个臃肿组件做内部再拆分,数据库模式则是把共享状态集中到唯一的持久化组件。

参考来源

- 位置:《软件架构理论与实践》第16章《软件架构重构》"16.4 面向模式的软件架构重构"节(源文件:_epub-src/OEBPS/text00131.html) - 结论依据:原文分别说明分层/正交/微内核/整体与部分/消息总线/数据库六种模式的重构判定标准和重构效果(如"我们将扇出最多的组件作为基础组件,基础组件依赖的组件看成是插件,删除插件间的依赖关系可实现面向微内核模式的重构"),并说明模式选择基于"模式与质量指标的关联表"、优先选择重构代价最小的模式,直接支撑本卡片结论。 - 原始内容:面向分层模式的架构重构首先将相似的组件聚为同一层,我们通过组件间的扇入扇出关系判断是否存在相似性……根据分层模式下层不依赖上层的方式,选择最合理的分层……我们将扇出最多的组件作为基础组件,基础组件依赖的组件看成是插件,删除插件间的依赖关系可实现面向微内核模式的重构。