为什么重构
在保持功能不变的前提下,利用设计思想、原则、模式、编程规范等理论来优化代码,修改设计上的不足,提高代码质量。
首先,重构是时刻保证代码质量的一个极其有效的手段,不至于让代码腐化到无可救药的地步。
其次,优秀的代码或架构不是一开始就能完全设计好的,就像优秀的公司和产品也都是迭代出来的。
最后,重构是避免过度设计的有效手段。在我们维护代码的过程中,真正遇到问题的时候,再对代码进行重构,能有效避免前期投入太多时间做过度的设计,做到有的放矢。
重构什么
大型重构指的是对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等等。这类重构的工具就是我们学习过的那些设计思想、原则和模式。
这类重构涉及的代码改动会比较多,影响面会比较大,所以难度也较大,耗时会比较长,引入 bug 的风险也会相对比较大。
小型重构指的是对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名、规范注释、消除超大类或函数、提取重复代码等等。小型重构更多的是利用我们能后面要讲到的编码规范。
这类重构要修改的地方比较集中,比较简单,可操作性较强,耗时会比较短,引入 bug 的风险相对来说也会比较小。你只需要熟练掌握各种编码规范,就可以做到得心应手。
什么时候重构
别等烂透了再整,防止产生破窗效应,看到了有不妥的地方就要积极去处理。
单元测试
- 发现代码中的bug,提高准确率,提升信誉度
- 帮助检查代码设计上的不足,越难编写单元测试说明设计的不够合理,可以帮助进行重构
- 集成测试的有力补充
- 阅读单元测试可以快速熟悉代码,通过测试用例可以快速了解该代码的功能、边界条件和特殊情况
- 单元测试是测试驱动开发最好的落地方案,边写代码边写单元
快速改善代码质量的编程规范
命名
- 作用域小的可以简化,作用域越大与应该命名清楚,不怕长
- 利用上下文简化命名
- 命名要可读、可搜索
- 接口\接口实现的命名:Ixxxx\XxxxImpl
注释
- 类、接口、方法写清楚干什么的,怎么用
- 内容中标明逻辑
函数
- 避免参数过多,超过四个建议封装成对象
- 勿用参数控制逻辑,应该将需要控制的逻辑拆分,更有用参数是否为null控制逻辑,更应该避免
- 职责要单一
- 避免过深的层次嵌套:
- 善于使用continue、break、return 提前推出嵌套
- 调整执行顺序,减少嵌套
- 封装部分函数减少嵌套