代码评审与代码重构 | 青训营笔记

273 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第7天。

在团队协作的项目开发中,如何保证和提升代码质量是一个重要的议题,下面来介绍代码评审和代码重构两种保证团队项目质量的方法。

代码评审 Code Review

代码质量关系着项目的未来发展和维护,那么为了保持代码的质量,就需要对代码进行评审。代码评审(Code Review,CR)是通过阅读源代码,检查代码是否符合编码规范以及前置发现代码质量问题。

CR的关注点

CR需要重点关注:

  1. 代码规范
    • 命名:变量名、函数名、类名是否清晰准确
    • 描述:提交的描述是否准确对应到功能
    • 风格:代码风格是否遵循统一规范
    • 文档:是否提交/变更了相应的文档
  2. 功能设计
    • 设计:设计是否良好、是否适合当前系统
    • 功能:实现是否正确
    • 简洁:实现是否简洁,有无更好的实现方式
    • 测试:是否包含自动化测试,代码可测性如何

小CL(Change List)的好处

前面介绍了CR是什么以及CR关注什么,下面来介绍小CL的好处。小CL是指提交进行Code Review的Change List要尽可能小,把一大段代码拆小再提交给CR。这样做的好处是审查将会更快(代码片段小,不需要太长时间)、更彻底(代码少,更容易看懂),更容易合入代码(合并时不会产生大的冲突),此外如果未能通过代码审查而被拒绝,也能快速修改。

如何面对CR的不同意见

  1. 正视批评
    • 当审查者对代码提出批评时,应当正视批评,不要为批评而倍感沮丧
  2. 修复代码
    • 如果审查者对代码的某一部分产生误解,应当及时澄清代码并加上注释
  3. 自我反思
    • 思考自己的解决方案是否合理,是否有更佳的解决方案
  4. 解决冲突
    • 尝试在基于技术事实和业界标准的基础上与审查者达成一致

代码重构

在很多时候,我们可能无法在项目的一开始就确定最佳的架构、最优的技术,可能会因为种种原因而导致代码质量没有那么高,也就是产生了所谓技术债(Technical Debt),给未来的项目维护带来了负担。常见的技术债产生原因有时间紧迫、技术水平不够等。既然是技术债,总归是要偿还的,解决技术债的一种方法就是对代码进行重构,以提升代码的可维护性。

代码重构是指对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

何时重构

重构,其实就是为了提高代码质量,不断对抗所谓的Code Smell(代码的坏味道)。因此,当出现Code Smell时,就应该进行代码重构了。常见的Code Smell有:

  • Duplicated Code 重复代码
  • Dead Code 死代码,代码没有什么用,但是却没有被移除
  • Long Method 冗长的方法体
  • Lazy Class
  • Feature Envy
  • Divergent Change
  • Refused Bequest
  • Shotgun Surgery
  • Inappropriate Intimacy
  • ......

常见的代码重构方法

  • 对于重复代码,可以抽离出公共代码,进行类型一般化(从几个类中抽取出公共部分作为这几个类的父类)
  • 对于参数过多的函数,可以将参数封装,通过函数调用获得参数(比如将几个关系较近的参数放在一个类中,传参时传入该类的对象,函数通过调用相关方法获得参数)
  • 对于过于冗长的函数,可以从中抽取出多个子函数,而不是把所有代码堆在一个函数中
  • 对于过于庞大的Switch-Case语句,可以通过策略模式、类型抽象来重构(把Case抽象为一个个类,并为这些类抽象出同一个方法,各个类通过重写方法来实现Case相关的代码,这样只需要调用这个方法而不是写一堆Case语句)
  • 对于嵌套的条件分支,可以提取方法来降低圈复杂度(把嵌套的条件取出来)
  • 对于长调用链(比如a.b().c().d()),可以通过隐藏中间人调用来解决(比如把d()直接提取到a中,实现a.d()
  • ......