知识卡片

设计债的四种识别方法

普通读书笔记卡

内容

设计债是软件设计和架构设计过程中采取的捷径措施及其缺点所构成的技术债——以前期设计中质量焦点不足(如可维护性、适应性差)的形式存在,或以随后缺少重构的零碎设计形式存在;架构技术债则可能因前期次优解决方案、或因技术和模式更新导致原方案变次优而产生。识别设计债有四种常见方法。ASA问题识别:自动静态分析(ASA)工具分析源代码或编译代码,寻找违反推荐设计规程的行为,这些问题可能引起错误或降低可维护性、效率等质量方面;部分问题可以通过重构移除以避免未来出现问题,代表工具是FindBugs。代码坏味道识别:Fowler首次提出这个概念,用来描述面向对象系统中违背良好设计原则(信息隐藏、封装、继承的使用)的设计,大致可分为长方法、大类、不稳定接口等几十种类型;代表性工具有CodeVizard(检测分析代码坏味道)和自动化分类器,但不同工具的精度和召回率差异很大——研究表明,在工业环境中自动化分类器有较高的召回率和精度。设计模式污垢识别:设计模式使用广泛因为它易于维护、灵活、缺陷少、能改进架构设计,但随系统用途和操作环境变化,原有设计会逐渐”漂移”、波及设计模式,导致原本使用的模式积累”污垢”(与模式无关的代码);当某些变化破坏了设计模式的结构完整性或功能完整性时,则称设计模式发生了”腐蚀”——无论污垢还是腐蚀都是技术债的表现形式,研究发现这类污垢和腐蚀曾影响开源系统JRefactory的可测试性。模块化冲突识别:大型软件系统中,模块本应设计成能独立演进的子系统,但在软件演化中,属于不同模块的组件却可能一起发生变化,这种差异可能来自快速不干净实现带来的副作用、或需求改变使原始架构设计已不适用——软件由此偏离早先设计的模块结构,这种情况称为”模块化冲突”,CLIO工具可用来检测和报告这类冲突。这四种方法从不同层面切入同一个问题:ASA和代码坏味道识别侧重”代码本身写得好不好”,设计模式污垢识别侧重”当初选用的设计方案是否还适配当前系统”,模块化冲突识别侧重”模块划分本身是否还合理”——三个层面各自独立又互补。

参考来源

- 位置:《软件架构理论与实践》第19章《软件架构技术债》"19.3.1 设计债的定义"及"19.3.2 设计债的识别方法"节(源文件:_epub-src/OEBPS/text00160.html) - 结论依据:原文说明"常见的设计债识别方法有四种,包括ASA问题识别、代码坏味道识别、设计模式污垢(design pattern fouling)识别和模块化冲突(modularity violation)识别等",并逐一说明各方法的原理、代表工具及局限,直接支撑本卡片结论。 - 原始内容:随着系统的用途和操作环境的变化,原来的软件设计逐渐发生漂移,这可能波及设计模式,即原来使用的设计模式随着软件设计的变化和漂移,会积累很多污垢(指与模式无关的代码);另外,当一些变化破坏了设计模式的结构完整性或功能完整性时,设计模式会发生腐蚀。