知识卡片

基于DSM的架构坏味道检测方法

普通读书笔记卡

内容

Garcia等人对架构坏味道的描述是定性的、依赖人工判断,Mo等人则往前推了一步,形式化定义了不稳定接口、隐式的模块交叉依赖、不健康的继承层次、模块交叉环、包交叉环这5种架构坏味道,让检测有了自动化的可能。整套方法的思路是从源代码结构信息出发、而不是从抽象架构图出发,分三步走:先用JDT(Eclipse的Java开发工具包)把源代码解析成抽象语法树,拿到包、类、方法、属性及其相互依赖关系这些原始事实;再把这些依赖关系整理成依赖结构矩阵(DSM,矩阵里ci依赖cj记为aij,依赖类型覆盖继承、方法调用、方法参数、方法返回类型、公有属性引用、属性类型、局部变量类型等7种耦合),并通过聚类算法把DSM中的类聚合成设计规则层次(DRH)——聚合的核心约束是”上层类不应该依赖下层类”,第一层放系统里影响范围最大的基类和关键接口,同层的类彼此保持独立;最后基于DRH做具体坏味道的形式化判定。这套方法最有价值的地方在于:它把原本需要架构师凭经验、逐一审视组件关系才能发现的问题,转化成了可以在代码层面机械计算的条件表达式——例如”不稳定接口”的判定,本质是同时满足两个可量化条件:一是这个类在结构上被依赖的范围超过某个阈值(通常设为类总数的一半,说明它是承担核心职责的主导类),二是它和某些类在版本历史中被频繁共同修改的次数也超过阈值——单纯”影响范围大”不算问题(本来就该被广泛依赖),单纯”改动频繁”也不算问题(可能只是活跃开发),两者叠加同时出现才说明这个接口设计得不稳定,牵一发动全身。”不健康的继承层次”的判定同样是把里氏替换原则的违背转化成了具体的依赖关系检查:父类反过来依赖了子类,或者存在某个客户端同时依赖父类和父类的全部子类——这两种情形都说明继承体系已经名不副实。书中给出的两个真实案例(均来自Cassandra代码库)验证了这套方法确实能在真实系统里揪出具体的问题类,而不只是理论构造。这套三步检测流程涉及的具体阈值设定公式、SRelation等形式化符号定义,以及聚类算法细节,属于该研究团队自成一套的具体实现,核心思路(源码解析→结构矩阵→分层聚类→形式化条件判定)已在本卡片概括,详细公式记入待关联术语。

参考来源

- 位置:《软件架构理论与实践》第20章《软件架构坏味道》"20.3.2 架构坏味道的检测"节(源文件:_epub-src/OEBPS/text00171.html) - 结论依据:原文说明检测方案"包括三个步骤:①代码解析;②DSM的生成;③架构坏味道的检测",并给出不稳定接口"当设定Impact_thr=10、cochange_thr=4、Change_thr=8时,第2行的类cassandra.utils.FBUtilities即为不稳定的接口类"及不健康继承层次"父类SSTableReader依赖子类SSTable,因此,这个类继承层次属于不健康的继承层次"两个具体判定案例,直接支撑本卡片结论。 - 原始内容:定性描述(需要修改历史信息):在版本修改过程中,如果高影响的接口类文件f1与别的类(文件)fi频繁发生共同修改现象,则称此接口为不稳定的接口……不健康的继承层次既违背了设计规则理论,也违背了Liskov替换原则。