知识卡片

重构点识别定位的五类方法对比

普通读书笔记卡

内容

重构点是需要重构的地方,其识别定位是实施重构的前提,五类方法之间没有绝对的优劣之分,只是适用场景不同、往往可以互相组合(如基于文本的方法常作为其他方法的辅助)。基于不变式的方法:对运行中的程序做动态分析,在循环头、程序进入退出点等特定位置动态识别不变式,用前置条件确定候选重构点、后置条件确保重构正确性(如Notkin利用Daikon工具识别出移除参数、消除返回值等5种重构实例)——优点是能验证重构前后外部行为是否保持一致,缺点是需要运行系统、通用性差、受代码覆盖率影响很大。基于文本的方法:把源代码经词法分析得到token串、通过文本比对检测(最常见的对象是重复代码,也能检测switch语句、平行继承体系、过多注释等)——优点是检测速度快、误检率低、与编程语言无关,缺点是没有考虑代码语义信息、检测种类少、漏检率高。基于度量的方法:用软件度量客观量化代码特征,排除主观检验的不稳定性,即使对程序完全不了解,也能通过指标大致把握代码整体特征(尤以复杂性度量为主)——优点是静态方法、不必运行程序即可评估,缺点是直接依赖度量规则的准确性、且没有考虑多态、异常、多线程等情况。基于聚类的方法:主要针对由内聚性耦合性问题引发的重构点,把内聚度低的函数分解成若干新函数以提高各自内聚度——优点是能覆盖不容易通过规则直接判断的复杂关系,缺点是受阈值影响很大(阈值选取准确则检测精度高,否则错报率漏报率都会大幅上升),且需要计算分析程序内部关系、时间复杂度高、检测耗时。基于设计模式的方法:设计模式为重构提供指导方向,通过定义”前驱位置”(能传递设计意图的结构,如Factory Method模式的前驱位置就是”Creator类必须创建一个Product类的实例”这样一条简单语句)来定位重构点,或用决策树、Prolog推理规则自动识别符合模式的重构候选位置——优点是能有效找到常见设计不足点,缺点是可能应用大量无谓的设计模式、反而导致过度设计、增加系统复杂度。这五类方法呈现出一条清晰的取舍轴:越贴近程序语义(不变式、聚类)越准确但越昂贵,越贴近表层特征(文本)越快但越粗糙,度量和设计模式则分别代表了”客观量化”和”经验沉淀”这两条中间路线。

参考来源

- 位置:《软件架构理论与实践》第16章《软件架构重构》"16.2.2 重构点识别和定位方法"及"16.2.4 现状分析"节(源文件:_epub-src/OEBPS/text00129.html) - 结论依据:原文逐一说明五类方法的原理及优缺点,如"基于不变式的定位技术……缺点是需要运行系统,通用性差,代码覆盖率十分有限……基于设计模式的定位技术……会出现应用大量无谓的设计模式的情况,从而导致过度设计,增加了系统的复杂度",直接支撑本卡片结论。 - 原始内容:基于文本的定位检测的优点是检测速度快,误检率低,且与程序语言无关。缺点是没有考虑代码的语义信息,检测种类少,漏检率高……基于聚类的定位技术:该方法受阈值影响较大,若阈值选取准确,则检测精度高、检测结果准确,否则会大幅度提高错报率和漏报率。