当我考虑保持代码简单时,我会想到普通软件工程师从初级到中级到高级的发展过程,而这个过程中经常提到的部分:
- 初级工程师:多行编写函数实现,喜欢简单的方法调用和注释而不是简洁。可能错过了一些提高性能或可读性的机会,或者没有为手头的任务使用最好的 API 方法,但代码有效。
- 中级工程师:将功能压缩到尽可能少的行,使用智能编码技巧来减少行。代码可以工作,甚至可能比初级版本更快,但可能更难理解或修改。
- 高级工程师:实现功能更接近初级;他们的代码简单明了,使用正确的 API 方法,确保良好的性能 - 但不会过早优化 - 并且易于理解和修改。
我已经多次看到这种模式出现了——我曾经是这些工程师中的每一个。我记得在我们团队的一位初级开发人员编写的拉取请求中重构了一些代码,认为我很聪明。我做了很多改进——从 10 行减少到 4 行!这太棒了,我想。更改被合并到代码库中,并且在很大程度上恢复到其原始状态后不久,因为人们需要使用该代码,而使用如此简洁的代码并将如此多的压缩成四行代码几乎是不可能的。那天我学到了一个很好的教训:代码行数并不是衡量代码质量的好标准。
我想到了这条关于 Jake Archibald经常使用 reduce 的推文:
所有使用的代码array.reduce
都应该重写,array.reduce
所以它是人类可读的
你是否同意reduce 函数的细节并不重要,但 Jake 推文背后的情绪很重要。你编写代码不是为了给你的同事留下深刻印象。您的代码的“智能”无关紧要。您的代码的可读性确实如此。保持代码简单,这样会更容易理解,更少的改变,更少的工作令人沮丧。简单代码的特征包括(但不限于)以下列表:
- 所有变量和函数都根据它们的行为/功能命名,并且易于理解。
- 代码中的任何函数都需要合理数量的参数;没有一个函数大到需要五个或更多参数来执行它的工作。
- 适当的 API 方法用于手头的任务,API 方法用于自定义实现。
- 使用正确的数据结构来表示应用程序的数据。
- 如果合适的话,会留下注释以添加上下文并传达仅通过代码无法传达的含义。
- 不使用“智能”快捷键;您无需搜索 JavaScript 语法的晦涩之处即可了解代码的作用。
- 出于性能原因,代码的可读性可能会降低,有一条注释可以解释这一点,并且最好链接到文档/电子邮件/Slack 线程/贵公司的内部 wiki,以添加上下文。
如果其中一些观点有点模糊,请不要担心。很难在一个快速列表中进行总结;我们将在专门的博客文章中深入探讨上述每个主题。
有时,代码就是不能简单。也许你正在使用一个可怕的遗留 API,它的接口在各方面都很奇怪,或者你被困在一个旧版本的库中,由于各种原因你无法升级。我工作过的大多数代码库都有开发人员回避的粗糙边缘或黑暗角落。我们也将研究解决这个问题的技术,并从阴暗的角落迁移到令人愉快的代码库和模块。