该材料的作者(我们今天出版的译文)说,她沉迷于编写简洁的代码。 她认为应该编写代码,这样,第一,将来,包括它的作者在内的其他程序员都可以方便地使用它,其次,考虑到扩展此代码的可能性。 也就是说,我们需要努力使其相对容易地向应用程序添加新功能,并使其易于维护其代码库。 如果编写程序时仅考虑计算机的需求,那么程序员可能只能在零和一的帮助下表达自己的想法,而不必担心其他任何事情。 本文提供了一些编写高质量代码的准则,并以JavaScript示例为例。

1.使用友好的变量和函数名称
使用清晰,描述性的函数和变量名称编写代码时,代码更易于阅读。 这是不太清楚的代码:
function avg (a) { let s = a.reduce((x, y) => x + y) return s / a.length }
如果您使用反映变量和函数含义的友好名称,则其可读性将大大提高。
function averageArray (array) { let sum = array.reduce((number, currentSum) => number + currentSum) return sum / array.length }
编写程序文本时,请勿追求简约。 使用完整的变量名,以后使用您的代码的任何人都可以轻松理解。
2.编写解决一个问题的简短函数
如果功能仅旨在解决一个问题,则功能更易于维护,变得更加易于理解和可读。 如果我们遇到错误,那么在使用小的函数时,查找该错误的来源变得容易得多。 此外,代码重用功能得到了改进。 例如,上面的函数可以称为
sumAndAverageArray
,因为在该函数中,我们使用
reduce
方法计算数组元素的值之和,然后求出平均值,将所得结果除以数组中元素的数量。 这是功能。
function sumAndAverageArray(array) { let sum = array.reduce((number, currentSum) => number + currentSum) return sum / array.length }
它可以分为两个功能,那么每段代码的作用将变得更加容易理解。 另外,如果我们创建一个大型程序,则
sumArray
函数的存在可能非常有用。 这是两个新功能的代码。 一种计算数组元素的总和,第二种返回它们的平均值。
function sumArray(array) { return array.reduce((number, currentSum) => number + currentSum) } function averageArray(array) { return sumArray(array) / array.length }
该功能可以分为两个符号是在名称中使用单词“和”的可能性。
3.记录代码
为您的代码编写好的文档-以后遇到它的人将了解该代码正在执行的操作以及原因。 这是功能失败的示例。 这里使用了一些“魔术数字”,它们的含义在任何地方都没有解释。
function areaOfCircle (radius) { return 3.14 * radius ** 2 }
您可以在此处添加注释,以使不知道用于计算圆面积的公式的人更容易理解此代码。
const PI = 3.14 // , function areaOfCircle (radius) { // : // return PI * radius ** 2 }
这段代码只是一个例子。 可能在这种情况下,与其引入自己的常数来存储Pi号,不如使用标准
Math.PI
属性。
对代码的注释应回答“为什么”的问题。
请注意,出于记录代码的目的,使用特殊工具和相应的代码注释规则是有意义的。 当应用于Python时,我喜欢
Google Style Docstrings ;当应用于JavaScript时,我喜欢
JSDoc 。
4.考虑使用Sandy Metz规则
桑迪·梅茨(Sandy Metz)是一位出色的Ruby程序员,做了有趣的演讲并写书。 她为用面向对象的语言编写简洁的代码制定了四个规则。 他们在这里。
- 类的长度不得超过100行。
- 方法和函数不应超过5行代码。
- 方法最多只能传递4个参数。
- 控制器只能初始化一个对象。
我建议观看她关于这些规则的
表现 。
我已经遵循这些规则大约两年了,它们在我的脑海中已经变得根深蒂固,以至于我在字面上“在机器上”遵循它们。 我喜欢它们,并且相信使用它们会增加维护代码的便利性。
请注意,这些规则只是建议,但使用它们会使您的代码更好。
5.依次应用所选规则
无论您是自己编写项目代码还是团队工作,一致地应用代码编写规则都是非常重要的。 尤其是,以下事实表达了这一点:任何阅读由于团队发展而产生的代码的人都应该将其视为一个整体。 使用这种方法,只能通过联系Git来确定各个代码行的作者身份。 如果在JavaScript中使用分号-请将其放在需要的地方。 这同样适用于引号-选择双引号或单引号,如果没有充分的理由,请始终使用您选择的引号。
我建议应用代码样式指南和linter,这可以使您将代码引入所选的标准。 例如,对于JavaScript我喜欢
标准JS的规则,对于Python我喜欢
PEP8的规则。
实际上,这里的主要目的是找到并遵守代码设计规则。
6.记住干原理
人们试图传达给想成为程序员的人的第一个想法是:“不要重复自己,干吧”。 如果在项目中发现重复的片段,请使用可减少相同代码重复的软件构造。 我经常建议我的学生玩
SET游戏,以提高他们的模式识别能力。
但是,如果您决定狂热地应用DRY原理或决定抽象掉选择不佳的模板,则代码的可读性可能会严重恶化,以后,您可能需要更频繁地创建相同结构的副本。 顺便说一句,桑迪·梅斯(Sandy Metz)撰写了一篇很棒的文章,论述了代码复制如何比
失败的抽象更邪恶
结果,在努力遵守DRY原则,将代码修改到难以理解的程度时,不值得重复,但也不值得。
7.使用封装和模块化的思想。
对相关的变量和函数进行分组,以使您的代码更易于理解,并在重用方面进行改进。 这是一个不是很好组织的代码的示例,其中有关人的信息以单独的变量的形式表示。
let name = 'Ali' let age = 24 let job = 'Software Engineer' let getBio = (name, age, job) => `${name} is a ${age} year-old ${job}`
如果在这样的程序中有必要处理许多人的数据,那么最好在其中使用类似以下结构的内容。
class Person { constructor (name, age, job) { this.name = name this.age = age this.job = job } getBio () { return `${this.name} is a ${this.age} year-old ${this.job}` } }
而且,如果程序只需要处理有关一个人的数据,则可以按如下所示排列它们。
const ali = { name: 'Ali', age: 24, job: 'Software Engineer', getBio: function () { return `${this.name} is a ${this.age} year-old ${this.job}` } }
以类似的方式,应该将长程序分成模块和单独的文件。 这将有助于使用在不同项目中的单独文件中分配的代码。 在带有程序代码的大文件中,通常很难导航,并且易于理解的小型模块易于在为其创建项目的项目中使用,如果需要,还可在其他项目中使用。 因此,力求通过组合逻辑上相关的元素来编写可理解的模块化代码。
总结
在本文中,我们与您分享了一些有关编写简洁易懂的代码的建议。 但是,这些只是建议。 这些提示可帮助您编写高质量的程序文本。 如果您系统地应用与此处描述的规则类似的规则,那么与不使用类似规则的代码相比,使用规则编写的代码将更易于理解,并且更易于扩展,维护和重用。
亲爱的读者们! 您对代码遵循什么规则?
