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