既然上层重构操作都可以转化为最底层的原子重构操作,那如何表达这种转化呢?表格中列举了几种常见的重构原子操作,每种重构原子操作都可以用一个函数来表达。例如Move Method,函数名为Move Method,我们用三个参数来明确它的行为:Source(所属类型)、Target(目标类型)以及(需要移动的方法),有了这些信息就可以明确一次Move Method原子重构。对于任何一个复杂的重构来说,都可以表示成如下形式的原子重构序列,即一系列原子重构的组合。
就像搭积木一样,任何上层重构都可以通过搭积木的方式组合底层原子重构来实现。
四、重构服务设计原则重构服务的设计亦如其它很多开发服务一样,最终目标都是提升用户开发效率与代码质量,如果二者皆得不到保证,那这款服务将被永远丢进垃圾堆里。从我们在华为内部的实践经验,总结了以下几点原则:
充分的用户交互:经典的重构工作流程为“小步前进,随时可用,随时可停,随时回退”,小步修改意味着每一步出错的可能性大大减小,要遵循这个流程,就离不开工具和用户频繁的交互,要引导用户一步步的完成复杂的代码重构,每个过程都要做到随时可用,随时可停,随时可退。
友好的重构工作界面:代码重构有点类似代码自动修复,但比代码自动修复涉及范围更广,如何让用户更好的表达重构意图、并且一目了然的看到重构对原代码架构的影响非常重要,这一部分有很多可以创新的地方。
个性化用户配置:上层级的重构往往可以有不同的执行路径,根据代码工程不同、业务场景不同,同一种坏味道重构的实现方式也可能不同,要以用户为中心,根据业务不同、用户不同给出个性化、定制化的重构解决方案,这一部分刚好是AI擅长的领域。
Devops服务深度集成:任何一款开发服务如果离开Devops服务就会成为一个孤立的散点,无法在开发过程中被顺畅的使用,如果我们能把重构服务集成进IDE、代码检视环节、代码入库环节以及验证发布环节,就可以让重构工具Build In在可信开发过程中,让重构服务触手可及。
高效:特别是在IDE上的重构分析服务,如果分析过程需要花费太长时间,程序员很可能就不会使用这些重构服务,他们宁可手工重构。