如何重构代码
如何发现代码质量问题?
从大处着眼的话,我们可以参考之前讲过的代码质量评判标准,看这段代码是否可维护、可读、可扩展、简洁、可复用、可测试。落实到具体细节,我们可以从以下几个方面来审视代码。
- 目录设置是否合理、模块划分是否清晰、代码结构是否满足“高内聚、松耦合”?
- 是否遵循经典的设计原则和设计思想(SOLID、DRY、KISS、YAGNI、LOD 等)?
- 设计模式是否应用得当?是否有过度设计?
- 代码是否容易扩展?如果要添加新功能,是否容易实现?
- 代码是否可以复用?是否可以复用已有的项目代码或类库?是否有重复造轮子?
- 代码是否容易测试?单元测试是否全面覆盖了各种正常和异常的情况?
- 代码是否易读?是否符合编码规范(比如命名和注释是否恰当、代码风格是否一致等)?
以上是一些通用的关注点,可以作为常规检查项,套用在任何代码的重构上。除此之外,我们还要关注代码实现是否满足业务本身特有的功能和非功能需求。
- 代码是否实现了预期的业务需求?
- 逻辑是否正确?是否处理了各种异常情况?
- 日志打印是否得当?是否方便 debug 排查问题?
- 接口是否易用?是否支持幂等、事务等?
- 代码是否存在并发问题?是否线程安全?
- 性能是否有优化空间,比如,SQL、算法是否可以优化?
- 是否有安全漏洞?比如输入输出校验是否全面?
重构的步骤
- 第一轮重构:提高代码的可读性
- 第二轮重构:提高代码的可测试性
- 常见的Anti-Patterns:
- 代码中包含未决行为逻辑: 代码的输出是随机不确定的,比如,跟时间、随机数有关的代码。
- 滥用可变全局变量
- 滥用全局方法
- 使用复杂的继承关系
- 高度耦合的代码
- 常见的Anti-Patterns:
- 第三轮重构:编写完善的单元测试
- 第四轮重构:所有重构完成之后添加注释
- 第五轮重构:选择合适的返回码: NULL,异常,错误码,空对象?
- 第六轮重构:各函数的异常处理代码