探索中国CIO人才现状 | 第四季调研报告
代码重构工具建议
2015-08-28  来源:techtarget

代码重构工具有很多,无论你使用的技术是什么。不管是Java、PHP、.NET还是其他,都有工具帮助重构代码的繁重过程变得轻松一点和安全。实际上,其数量已经多到眼花缭乱令人难以选择的地步。

在此,我们将讨论一下在选择工具时应该检查哪些功能,并解释每一项功能究竟会如何影响到重构的过程。

方法与变量重命名

重命名方法和变量是我在重构代码时最常做的事情。对于我之前的开发者来说很明显的事情(所以没有采用长长的描述性名字)对于那些刚接触这些代码的人来说未必那么明显。每次扫描新的代码库去了解它时,我都会对变量和方法进行重命名,以便更彻底地了解它们是做什么用的。

几乎所有的代码重构工具都会做这个,但是你应该留意的是也可以修改注释的工具。注释往往会通过名字引用变量,如果你对变量进行了重命名,那些注释就没有意义了。

重命名后生成接口

继重命名功能之后,生成接口是我最常用的功能。更新老代码往往意味着要引入对现有类的接口以便引入控制反转。人工生成接口并不困难,但是重新输入所有你往曝光的属性和方法签名十分单调乏味且容易出错。

析取方法

把一个大方法分解成可测试的片段,这是重构单元测试时的一种常见做法。有这么一个功能,让你可以突出一批行并将它们析取到独立的方法,再利用适当的参数来完善该方法,这样的话可以节省大量时间。

使用这种重构时,要小心检查生成的代码。我尚未发现有哪款重构工具能够做好这一点的,尽管其生成的东西至少让我可以开始了。未来获得最好的结果,要留意突出来析取出去的行,确保你把该范围内任何本地变量都包含进来了。哪怕变量是本地的,如果声明没有被包含突出的部分也会被当作参数传递。幸运的是,做出来的方法只在一个地方使用,因此人工重构参数也不难。

析取父类

跟遗留代码打交道时,我发现基类的想法很少被实现过。我喜欢把尽可能多的逻辑放进基类,然后继承给子类,从而让处理更加容易,并帮助处理泛型方法和类。

在定义基类的时候,有个重构功能可以把父类(或超类)析取处理是有帮助的。在基类中选择你想要的属性和方法,然后点击按钮来创建新类,让当前的继承自它。不幸的是,我从未发现有代码重构工具也可以扫描别的类来找出兄弟类的。不过随着人工智能的进步,也许我们会看到这种功能的出现。

修改方法签名

操作方法签名很容易出错,尤其是当所有的参数都是一样的时候。如果你有一个方法要取两个字符串,但是因为某些原因参数的顺序对于你来说是没有意义的会怎样?没有自动化的方法签名操作,改变这些参数的次序是有风险的,因为如果你忘记改变其中一个方法调用的次序的话,编译器是不会发现问题的。

从方法签名析取DTO

我是目录工具包输出(DTO)的粉丝,DTO是用来供参数多于1、2个的方法间传递数据的。有一个常常的参数清单是很难读的,也很难隐藏不同方法之间的关系—如果两个方法都有着相同的长签名,相对于两个都使用相同DRO作为参数的方法来说会更难看清楚。给DTO增加一些验证逻辑以确保所有必要的数据都具备也是有可能的(我知道这延伸了DTO的定义,但现在我们先不管这一点)。

如果重构功能可以从签名中析取DTO的话,那它应该也可以重构所有使用该DTO的调用代码。这可能会有大量代码。在使用的时候,这一功能可以节省大量时间。

迁移到资源文件

我最后的一项建议自己不经常用,但需要用到时,它可以节省大量时间。在给现有应用增加I18N支持时,所有的那些硬编码进app的字符串都需要迁移到资源文件。这是一项辛苦、乏味、容易出错的工作,很快就让我想休息一下。如果你给任何应用增加多语言支持的话,单这项功能就值得上你为代码重构工具的任何付出了。