首发公众号《andyqian》,期待你的关注!程序员
程序员在职业生涯中,不可避免的就是接手老项目,重构历史项目。事实证实,不管是老项目仍是新项目都会遇到这种状况,不信你去看看一周前本身写的代码,是否是有很大的改进空间?对于新入行的朋友们也要作好准备,之后也或多或少会面对这样的状况。在面对这样的状况时,无论你接手前是多么不肯意,接手后怎么破口大骂,甚至有过无数次想放弃的念头。但问题始终摆在那,始终须要面对。在最近一段时间里,一直在进行项目重构方面的工做,项目不大,但在重构过程当中,依然有一些感觉,想借此机会分享出来。不过,如今去看看已经重构过的代码,依然有很大的改进空间。数据结构
在介绍重构方法以前,下面几个原则是很是重要的,甚至在重构时都是须要时刻紧记。不然在重构过程当中,必定会让你十分痛苦,甚至会多几回想放弃的念头。性能
以最小单元为重构点。也就是说:不要一上来看这不顺眼,看那也不顺眼,改了一通,到最后项目都运行不起来。单元测试
对于重构后的方法,功能点,必定要验证经过后再重构下一个。该写的单元测试一个也不能少。测试
对外提供的接口,不管是Rest接口仍是RPC接口,用冗余的方式进行重构,意思是说:对已经对外提供的接口,在保证正确的前提下,内部怎么重构均可以,但不要修改对外的数据结构。或者采用升级接口版本的形式,将老接口标记为过期,老接口与新接口并存运行的形式。spa
之因此将其放至首位,由于我以为这是在动代码以前最重要的步骤。理清楚这个服务的职责,主要流程,关键步骤,关键状态的转换是很是重要的。若是以前有设计文档描述了这些内容就再好不过了。咱们只须要对照着设计文档先对系统有个宏观的印象,再对照着文档与代码进行一步步查看一遍,这一遍并不须要很仔细,最主要是对涉及到的对象,数据流向有初步印象便可。若是没有任何文档,或者文档已经和代码彻底不匹配时,咱们也只能硬着头皮经过代码来还原文档了。这时咱们能够先经过代码的执行流程,画时序图理清楚服务内部交互的方式,能够经过画类图理清楚类与类之间的关系,能够经过画流程图来理清楚数据的走向。让比较具体的代码形式转换为更抽象化的文档形式。首先我必须认可,这是一个很是痛苦的过程,但这算的上是一个有效的办法。同时这也是我作的不够的地方,接到任务后一心想着钻进代码改这改那,却忽视了这最重要的步骤。.net
经过上一步,对咱们须要重构的项目基本有了清晰的轮廓。到这一步,咱们最主要的职责是找出事件入口并体验。这里指的事件是指暴露形式,如:Rest接口,RPC服务,定时任务等形式。咱们只有体验了流程,才能找出代码中的坏味道。若是对项目彻底不熟悉或者只知其一;不知其二的强烈推荐用debug的模式一步一步看看代码的执行过程,避免发生重构后形成服务不可用的惨案。这时若是遇到以为须要重构的点,能够先记录下来,直到debug完成后。这时记录下来的点,就是你须要重构的地方。若是你发现,重构完这些点都足以从新写了,那么,刚才的那一遍debug对你理解流程以及注意事项是有帮助的。debug
完成前两步后,咱们都应该对流程,数据流向都很是熟悉了。如今来修改代码再合适不过,但在修改前,我依然建议你们用冗余的方式进行修改。也就是说:此时咱们还不要急着删除原来的代码,建议从新起一个单独新的内部方法,进行编写,单元测试,在入口修改成重构后的方法,再进行集成测试,验证,直至上线。重构代码线上验证经过后,再删除老代码也何尝不可。咱们在软件开发时,崇尚“小步快跑,快速迭代”的迭代思惟,一样的,我建议重构也应该是这样的,不建议修改了很是多或所有重构完成再进行验证,这样不管验证时间仍是验证范围都是不可接受的。设计
写单元测试是一个神奇而无味的工做,神奇在于它能挖掘出不少低级,甚至想抽本身巴掌的错误,无味在于你们认为这是一项毫无技术难度的苦差事。却不知在重构项目时,单元测试也发挥了及其重要的做用,咱们能够经过单元测试来熟悉项目,熟悉流程,熟悉每个方法,熟悉每一个数据的走向。在重构完成后,咱们也应该编写单元测试进行验证,在代码修改后,咱们也应该对单元测试进行修改,进行验证,保证代码与单元测试是一一对应且同步的。3d
固然,重构过程当中,除了单元测试外,也须要本身进行功能性测试,更须要测试同窗的功能测试,边界测试,性能测试等等。总之,重构过程,是一个合做的过程。
其实不论重构项目,仍是入职新公司熟悉项目,均可以使用上面的方法进行实践。经过上面这些步骤,基本上能对项目加深影响,可以让本身对项目有个更深层次的理解。如今回顾看看本身前一个月,前一周的代码都有不少须要修改,值得精进的地方。嗯,代码须要迭代,系统须要重构,你我也需精进!
嗯,唠叨了这么多,也算是对最近重构工做的复盘吧!
相关阅读:
《软件之路》
扫码关注,一块儿进步
我的博客: http://www.andyqian.com