软件开发项目往往时间紧、任务重、人手不足、经验不够。。。。加班!哪里有时间重构?

    事实上,重构是提升软件质量的有效方法,同时通过重构活动可以有效避免软件过快“腐烂”。

    OK,你的项目不做重构活动没有关系,但是如果你要做,这里有一些重构活动的原则供参考。

    《重构》上描述的内容太多,如果全部按照书上。。。项目永远不要结项了:(


【时机】

1、代码功能实现后,根据代码检视意见修改。

2、添加新功能前,如果功能需要修改原代码很多地方,考虑先重构一下。

3、模块到达一定体积,建议每200~300行重构一次(Java),最多不要超过500行。


【前提】

1、完善的测试用例,至少覆盖到设计的方方面面,比较重构前后的代码表现。

2、完善的注释,退一步,如果注释不足,至少重构者要非常了解代码。


【重点】

实际工程应用中,重点是投入多少人力,目标效果怎么样,要看各个项目不同安排不同的时间。

没一轮重构,可以修改各类问题,但是侧重点不同,重点部分一定要全部修改,其他部分根据时间、人力等随时调整策略。

第一轮:重复的代码或者逻辑

可以使用检查工具获得,具体检查工具的选用需要项目组根据自身情况选择。另外工具也没那么智能,对于一些逻辑上类似的代码,需要人工检视。

重复代码一般首先抽取出来,形成一个独立函数,如果是面向对象可以使用private,后续根据需要调整直到public,甚至如果有必要可以发布为接口。

IDE中一般都有抽取函数的选项,这是最常用功能之一。

这一轮一般占用时间最长,也可以和其他的重构合并在一起,目标是将所有逻辑重复的代码只保留一份。

后续在新增功能的时候,不需要在分布到系统里面的、同样逻辑代码上花费太多时间。

第二轮:过长函数(独立功能块)

过长的函数是代码腐烂的罪魁祸首!没人看得懂、没人改得了!

项目自己制定标准,什么是过长,如果严格一点,可能超过30甚至20行就算过长了。一般,要求一个函数只负责一个事情,比如在java开发时,如果函数名使用3个实际单词还不能描述自己的功能,建议拆分。getNameByIndex、getNameByAddr,这些已经算是长的了。(实际可以用重载根据输入决定具体使用哪个,例子不好,后续更新吧)

getNameByIndexAndStatus,看这个名字,就可以拆分成getNameByIndexStatus1/getNameByIndexStatus2...,然后再通过重载拆分成getNameStatus1/getNameStatus2...对于ByIndex、ByAddr都重载一下。

第三轮:方法的处理

方法要放置在最合适的类中,常用手段有上拉、下推、移动到其它类等。谨慎!尤其是多个地方要引用的,如果不是非常有必要,还是不改吧。。。

第四轮:临时变量、命名

实际应该算是“其它”部分,如果有时间,多多思考还有什么需要改的。

第五轮:修改注释

好的代码是自注释的,但是在项目中仍然要给别人预留阅读的方便。重构优秀的代码不需要对功能本身加太多注释,但是要增加下面一些内容:

在哪个版本引入、作者、日期、和其它包、类的关系、如果有性能要求的要增加性能要求和实测说明。

一般人手不是非常充足,到这里就足够了。

重构也是一个培养习惯的过程,一般3~6个月以后,重构说花费的时间大大减少,甚至开发的时候顺便就完成了。


最后,祝各位程序猿和程序媛加班不要太晚哦~