如今,公司对软件工程师(主要是高级工程师)最迫切的需求之一,是以迭代和增量的方式提供高质量的代码审查。
这意味着在每次 PR 审查中,开发人员被要求反复提高即将合并代码的质量。
在这篇文章中,我将尝试指出开发人员在进行重构或审查时应牢记的基本原则。
让我们逐个主题来看这些点:
#1. 命名
- 有明确意图的命名:方法或变量名应该在查看代码实现之前就能解释其意图。
- 类名应该是名词或名词短语。
- 方法名应该是动词。
- 为每个概念选择一个词:get、retrieve、fetch 是相似的,选择一个统一使用它。
- 使用计算机科学术语:例如,AccountAdapter 对程序员来说意味着适配器模式,如果没有相关的计算机科学名称,则使用面向问题的名称。
- 使用可搜索的名称:在 IDE 中搜索特定短语会更容易。
#2. 函数
- 函数应该小:函数越大,调试起来就越困难。
- 块和缩进应该整洁:用好 IDE 的代码格式化。
- 只做一件事:一个函数意味着一个任务。
- 每个函数一个抽象层次:函数应该足够小,以便在一个抽象层次的范围内实现。
- 从上到下阅读代码:应该应用逐步下降规则。嵌套函数应该在母函数之后,以便有像阅读书籍一样的感觉。
- 使用较少的输入:超过 3 个输入则很糟糕,这可能意味着函数在做不止一件事。
- 没有副作用:函数应该只做一件事,并且应该正确地做这件事,而不对其他状态产生不良影响。
- 没有重复:将频繁使用的代码片段集中在一个地方。
#3. 注释
- 尽量用代码表达意图:你的代码应该是自解释的,以至于读者不需要额外的注释。
- 好的注释:
- 坏的注释:
#4. 格式化
- 垂直格式化:类的大小最多 200-300 行代码。
- 报纸隐喻:类应该像报纸文章一样。
- 垂直开放性:类中变量/方法之间的垂直距离。
- 变量声明:类变量在构造函数之前,局部变量靠近其使用位置。
- 依赖的方法应该靠近其实现:以便轻松地从一个代码行跳到另一个代码行。
- 水平密度:避免需要滚动的长行。
- 团队规则:团队的一致性比干净的代码更重要。
#5. 对象和数据结构
- 数据/对象反对称性:
- 迪米特法则:模块不应该知道它操作的对象的内部。
- 数据传输对象:具有公共变量且没有函数的类使得数据传输更容易,但可能存在安全问题。
#6. 错误处理
- 尽可能使用异常:而不是返回 null 或错误标志,抛出异常。
- 在异常中提供上下文:尝试制定良好的异常处理策略。
- 不要返回 null,不要传递 null。
#7. 单元测试
- TDD 法则:
- 保持测试干净和可读。
- 每个测试/每个主题/每个概念一个断言。
- 测试应该是 F.I.R.S.T.:
#8. 类
- 封装:利用面向对象编程。
- 单一职责原则:每个类应该有一个单一的责任。
- 内聚性:函数操作的变量越多,它的内聚性就越强。
- 应使用极简主义方法。