重构的定义
重构是通过调整程序代码来提高软件的质量和性能,使程序的设计模式和架构变得更加合理,提高软件的可扩展性和可维护性。——转自【重构改善现有代码的设计】
简单来说就是在不改变系统功能的情况下修改代码。它是一个黑匣子,没有感知。
不变的首页,变化的技术重建机会
一个项目持续了一年多。中间需求变化频繁,增加了更多的新功能。在需求的反复迭代和变化中,再加上人员的不稳定,原来的方法变得非常臃肿,后期实现功能或者查找修复bug变得非常复杂。这时候我才意识到,是时候重构了。
重建的目的
让系统代码更容易理解,节省后期开发成本。
重构的方法——代码的臭味
通过模块将一个大函数拆分成几个小函数在代码重构中非常非常常用。重构时提倡细分代码模块,因为模块越小,复用性越大。不要写大函数。如果你的函数太大,那就意味着你的函数需要重构。因为功能太大,可维护性和可理解性会变差。而且当你实现类似的功能时,很容易产生重复的代码。写代码的时候,最忌讳的就是代码重复。所以当函数太长的时候,你需要对它进行细分,把原来的函数拆分成几个函数。在这个项目中,我发现很多函数太大太长,如下图所示。
一个保存文件实体的方法有230行代码,严重影响了代码的可读性。通过分析这种方法,我们做到了这些。
历史数据的处理
文件编号的生成
添加文件
更新文件
那么我们可以拆分出来的四个功能也是一个独立的模块。因为函数很短,所以很容易理解和重用。
saveHist
getFileNo
saveFileEntity
updateFileEntity
2.整合琐碎的小功能,过度封装。
有些方法不需要封装,可以直接在方法中调用。以下情况完全没有必要,过度包装反而会增加开发者的可读性。
3.用文字常量替换幻数
这是显而易见的,但我在实际项目中经常发现这种现象。以下案例比比皆是。这不是个人能力问题,而是个人态度问题,需要开发组长的监督。
4.移除参数的赋值。
也就是不要给函数中的函数参数赋值。也就是说,你不应该在函数的作用域内给函数的参数赋值。因为参数的初始值会丢失,所以我们需要引入一个临时变量,然后对它进行操作。如下例所示,有必要保留对applyIds的更改并重新定义临时变量。
5.PO/VO是一个严重冗余的重复属性。
如下图所示,三个对象的属性是相同的,F1到F99。这在数据库存储和系统查询上都造成了存储和内存的极大浪费,直接影响了整个系统的性能。这种对象必须拆分。
转型后
6.重复代码。如果你在一个java文件或者多个java文件中看到相同的程序结构,你会怎么想?你会立刻轻蔑地看着。虽然复制代码在一定程度上提高了编程速度,但也带来了更多不可预知的问题。这时候就要尽量合并到一个地方,这样代码看起来更整洁美观。把重复的代码封装成一个函数,让需要的地方调用这个函数。
7.参数列方法过长。这是一段很难看的代码,方法参数太多,很容易导致传错值。这个时候我们就要把这个参数抽象成一个对象。
8.过度类提取类-精炼类。经过多次需求迭代,一个类必然变得越来越长,越来越臃肿,可读性极差。这个时候,我们需要重构和细化这个类。下面的课有3500行,不亚于一部小说。通过类分析,可以将相关函数的方法集成到一个类中,这样就可以拆分出几个类。建议一个类不要超过500行,一个方法不要超过200行。
9.注意代码。为了保持代码的整洁,拥有愉快的编码心情,建议清理掉所有不必要的代码或者带注释的代码。
重建经验
随着项目需求的不断迭代,逐渐发现付出的成本也在上升,重构是不可以的。
但我更意识到,重构还有很长的路要走。不是任务而是意识,因为他必须随时随地关注,改进优化代码。
它体现在
1.添加新函数时,需要理解修改后的代码。如果发现代码不容易理解,不能轻易添加功能,这时候就需要重构代码了。
2.在修复有缺陷的bug时,通过重构改善代码结构,可以帮助你找到bug的原因,并快速修复。
3.在CodeReview期间,有经验的开发人员可以在评审代码时提出一些关于代码重构的建议,这是一种宝贵的经验。
推荐一些重建的经典。
重构——改进现有代码的设计
代码整洁干净代码