返回文章列表
读书笔记代码质量编程规范软件工程Clean Code

《代码整洁之道》读书笔记

2025-01-2012 分钟

关于这本书

《代码整洁之道》(Clean Code)由 Robert C. Martin(人称 Uncle Bob)所著,是软件工程领域的经典之作。书中系统阐述了编写整洁、可维护代码的原则和方法。作者认为,代码的可读性是衡量代码质量的首要标准,因为代码被阅读的次数远远多于被编写的次数。本文将记录书中几个核心章节的要点和我的理解。

有意义的命名

命名是编程中最常见也是最重要的活动之一。好的命名可以极大地提升代码的可读性,而糟糕的命名则会让代码难以理解和维护。

命名原则

  • 名副其实:变量名应该能够回答"它是什么"、"它为什么存在"、"它如何使用"这三个问题。避免使用无意义的名称如 data、info、temp(除非确实是临时变量)。
  • 避免误导:不要使用与实际含义不符的名称。例如不要用 accountList 命名一个非 List 类型的集合。避免使用仅有细微差别的名称,如 XYZControllerForEfficientHandlingOfStrings 和 XYZControllerForEfficientStorageOfStrings。
  • 做有意义的区分:如果必须使用不同的名称来区分两个事物,那么区分应该是有意义的。避免使用数字序列(a1, a2, a3)或无意义的词语(ProductInfo vs ProductData)来做区分。
  • 使用可搜索的名称:单字母变量和数字常量难以在代码中搜索。使用有意义的名称替代魔法数字,例如用 MAX_RETRY_COUNT 替代 5。

好的命名应该让读者无需查看定义就能理解其用途。如果一个名称需要注释来解释,说明命名本身就不够好。

函数设计

函数是代码组织的基本单元,编写整洁的函数是编写整洁代码的核心技能。

核心原则

  1. 短小:函数应该尽量短小。作者建议函数最好不超过 20 行,理想情况下控制在 5-10 行。短小的函数更容易理解、测试和维护。
  2. 只做一件事:函数应该只做一件事,做好一件事,只做这一件事。判断函数是否"只做一件事"的方法是:看能否从函数中提取出一个新的函数,且新函数不仅仅是原函数实现的重新描述。
  3. 每个函数一个抽象层级:函数中的语句应该处于同一抽象层级。高层级函数调用低层级函数,形成自顶向下的阅读顺序。不要在同一个函数中混合高层级的业务逻辑和低层级的实现细节。
  4. 参数数量:函数的参数越少越好。零参数最理想,一个参数次之,两个参数可以接受,三个及以上的参数应该尽量避免。如果确实需要多个参数,考虑将它们封装成一个对象。
  5. 无副作用:函数应该忠实于它的名称所表达的功能,不要偷偷做额外的事情。例如一个名为 checkPassword 的函数不应该顺便初始化会话。

注释

关于注释,作者持有一个鲜明的观点:好的代码本身就是最好的文档。注释往往是代码表达能力不足的补偿。当你想要写注释时,首先应该思考是否可以通过改善代码本身来消除注释的必要性。

好的注释

  • 法律信息:版权声明和许可证信息是必要的注释
  • 提供信息的注释:解释正则表达式的含义、说明返回值的格式等
  • 对意图的解释:解释为什么选择某种实现方式而非其他方式
  • TODO 注释:标记将来需要完成的工作,但应该定期清理
  • 警示:对可能产生严重后果的操作发出警告

坏的注释

  • 喃喃自语:随意添加的、连作者自己过段时间都看不懂的注释
  • 多余的注释:代码本身已经足够清楚,注释只是在重复代码所表达的内容
  • 误导性注释:注释描述的内容与代码实际行为不一致,这比没有注释更加危险
  • 注释掉的代码:不要在代码中保留被注释掉的代码块,版本控制系统会帮你保存历史
  • 日志式注释:在文件头部记录修改日志,这是版本控制系统的工作

格式化

代码格式化看似琐碎,但对代码的可读性有着重要影响。作者提出了几个格式化原则:

  • 垂直方向:文件应该像报纸文章一样组织,最重要的概念放在前面,细节放在后面。相关的代码应该靠近放置,概念间用空行分隔。
  • 水平方向:代码行不宜过长,建议控制在 80-120 个字符以内。使用适当的缩进和空格来表达代码的层次结构。
  • 团队统一:在团队中应该统一代码格式规范,使用自动化工具(如 Prettier、ESLint)来强制执行格式化规则,避免在代码评审中浪费时间讨论格式问题。

错误处理

错误处理是编写健壮软件的重要组成部分,但如果处理不当,反而会让代码变得混乱不堪。

  • 使用异常而非返回错误码:异常机制可以将错误处理逻辑与正常业务逻辑分离,使代码更加清晰。
  • 先写 try-catch-finally:在编写可能抛出异常的代码时,先构建 try-catch-finally 结构,有助于思考异常情况下程序应该如何表现。
  • 提供异常发生的上下文:捕获异常时,应该记录足够的信息来定位问题,包括操作的意图和失败的原因。
  • 不要返回 null:返回 null 会迫使调用者进行 null 检查,容易遗漏导致空指针异常。考虑使用特殊对象(如空列表)或 Optional 类型替代。
  • 不要传递 null:除非 API 明确要求,否则不要将 null 作为参数传递给函数。

总结

《代码整洁之道》中的许多原则看似简单,但在实际项目中始终如一地践行却并不容易。编写整洁代码需要刻意练习和持续的代码审查。我认为这本书最大的价值在于帮助开发者建立了一种"代码审美",让我们在编写代码时始终思考:这段代码是否足够清晰?能否让下一个阅读它的人快速理解?如果每次提交代码时都能让代码变得比之前更好一点,长此以往,整个代码库的质量就会持续提升。