盐和胡椒振动器的例证有化学名字的在举行。

人类可读的javascript:两个专家的故事

每个人都想成为一名专家。但这甚至是什么意思?多年来我见过两种类型的人被称为“专家”。专家1是一个了解语言中每个工具的人,并确保使用它的每一位,无论它是否有帮助。专家2也知道每一块语法,但它们是关于他们采用的东西解决问题的挑剔,考虑到许多因素,两种因素都有与之相关的。

继续下面的条

你能猜猜我们需要哪位专家加入我们的团队吗?如果你选的是专家2,那就对了。他们是一名开发人员,专注于交付可读的JavaScript代码行,其他人可以理解和维护。他能让复杂变得简单。但是“可读”很少是确定的——事实上,它很大程度上取决于观察者的眼睛。那我们该怎么办呢?在编写可读代码时,专家应该瞄准什么?有明确的正确和错误的选择吗?答案是,视情况而定。

显而易见的选择# section2

为了提高开发人员的体验,近年来,TC39向ECMAScript添加了许多新特性,包括许多从其他语言借鉴的经过验证的模式。在ES2019中添加的一个这样的添加是array.prototype.flat()它需要一个深度的论证,并将阵列夷为平地。如果没有给出参数,depth默认值为1。

在此之前,我们需要使用以下语法将数组平铺到一个层次。

让arr = [1,2,[3,4]];[] .concat.apply([],Arr);// [1,2,3,4]

当我们添加了平(),可以使用单个描述性函数来表达相同的功能。

arr.flat ();// [1,2,3,4]

第二行代码是否更易读?答案是肯定的。事实上,两位专家都会同意。

并不是每个开发者都会意识到这一点平()的存在。但他们不需要,因为平()是一个描述性动词,用来表达正在发生的事情的意思。它比concat.apply ()

对于新语法是否比旧语法好这个问题,只有在这种情况下才有明确的答案。两位专家都熟悉这两种语法选项,他们将选择第二种。他们会选择更短、更清晰、更易于维护的代码行。

但选择和权衡并不总是那么果断。

肠道检查# section3

JavaScript的神奇之处在于它具有令人难以置信的通用性。网上到处都是是有原因的。不管你觉得这是好事还是这又是另一回事了。

但随着这种多功能性来说是选择的悖论。您可以以许多不同的方式编写相同的代码。你如何确定哪种方式是“正确”?除非您了解可用的选项及其限制,否则您甚至无法开始做出决定。

让我们使用函数式编程地图()作为这个例子。我将走过各种迭代,所有的迭代都是相同的结果。

这是我们的地图()例子。它使用最少的字符,全部适合一行。这是我们的基线。

const arr = [1,2,3];让多个uldbytwo = arr.map(el => el * 2);// multipliedbytwo是[2,4,6]

下一个示例只添加了两个字符:括号。有什么损失吗?如何获得?有多个形参的函数总是需要使用括号,这有区别吗?我认为确实如此。在这里添加它们几乎没有害处,而且当您不可避免地编写带有多个参数的函数时,它可以提高一致性。事实上,当我写这个的时候,更漂亮强制执行该约束;它不希望我在没有括号的情况下创建箭头函数。

让多个uldbytwo = arr.map((el)=> el * 2);

让我们更进一步。我们添加了花括号和返回值。现在这看起来更像一个传统的函数定义。现在,让关键字和函数逻辑一样长似乎有点小题大做。但是,如果函数不止一行,则再次需要这个额外的语法。我们是否假定我们不会有任何超出一行的其他函数?这似乎可疑。

让multipliedByTwo = arr.map((el) => {return el * 2;});

接下来,我们完全删除了箭头函数。我们使用了和之前一样的语法,但是我们换成了功能关键词。这很有趣,因为没有这种语法不起作用的情况;没有数量的参数或行会导致问题,因此在我们方面是一致的。它比我们的初始定义更冗长,但这是一件坏事吗?这是如何触及新编码器,或者在JavaScript以外的东西中熟悉的人?是一个知道javascript的人在比较中对这个语法感到沮丧吗?

let multipliedByTwo = arr.map(function(el) {return el * 2;});

最后,我们得到最后一个选项:只传递函数。和Timestwo.可以用我们喜欢的任何语法编写。同样,不存在传递函数名会导致问题的情况。但是退后一步,想想这是否会让人困惑。如果你是这个代码库的新手,很明显Timestwo.是一个函数而不是对象?当然,地图()给你们一个提示,但是忽略这些细节也不是没有道理的。地点在哪里Timestwo.被声明和初始化?容易找到吗?清楚它在做什么以及它是如何影响这个结果的吗?所有这些都是重要的考虑因素。

const timesTwo = (el) => el * 2;让multipliedByTwo = arr.map(timesttwo);

你可以看到,这里没有明显的答案。但是为代码库做出正确的选择意味着了解所有选项及其限制。并且知道一致性需要括号和卷曲括号返回关键词。

有许多问题在编写代码时必须问自己。问题的表现通常是最常见的。但是当您查看功能相同的代码时,您的判断应该基于人——人是如何使用代码的。

也许更新并不总是更好#第四单元

到目前为止,我们已经找到了一个明确的例子,表明两位专家都愿意使用最新的语法,即使它不是普遍已知的。我们还看了一个例子,它提出了很多问题,但没有给出很多答案。

现在是时候深入研究我以前写过的代码了……这段代码让我成为了第一个专家,使用一段鲜为人知的语法来解决一个问题,这损害了我的同事和代码库的可维护性。

解构的任务允许您从对象(或数组)中解包值。它通常是这样的。

const {node} = exampleObject;

它初始化一个变量并将其分配一行中的值。但它不一定。

让节点;({node} = exampleObject)

代码的最后一行使用解构将变量赋给一个值,但是变量声明发生在变量前面一行。这并不是一件不寻常的事情,但很多人并没有意识到你可以做到。

但是仔细看看这些代码。对于不使用分号来结束行的代码,它强制使用一个尴尬的分号。它将命令包装在圆括号中,并添加花括号;我们完全不清楚它在做什么。它不容易阅读,而且,作为一个专家,它不应该出现在我写的代码中。

让node node = exampleObject.node

这段代码解决了这个问题。它是有效的,它的作用很明显,我的同事不用查就能理解。使用解构语法,因为我能够并不意味着我应该

代码不是万能的# section5

正如我们所看到的,Expert 2解决方案很少仅仅基于代码而明显;然而,每个专家编写的代码之间仍然有明显的区别。这是因为代码是由机器来阅读,由人类来解释的。所以需要考虑非代码因素!

您为JavaScript开发人员团队所做的语法选择与您为一个不专注于细节的多语言团队所做的语法选择是不同的。

让我们来看看spread和。concat ()举个例子。

Spread在几年前被添加到ECMAScript中,并得到了广泛的采用。它是一种实用语法,因为它可以做很多不同的事情。其中之一是连接多个数组。

const arr1 = [1,2,3];Const Arr2 = [9,11,13];const nums = [... arr1,... arr2];

尽可能强大,它不是一个非常直观的符号。所以除非你已经知道它的所作所为,否则它并不是超级乐于助人。虽然这两个专家可能假设一个JavaScript专家团队熟悉这个语法,Expert 2可能会质疑一个多语言程序员团队是否真的如此。相反,专家2可以选择concat ()方法,因为它是您可以从代码的上下文中了解的描述性动词。

此代码片段向我们提供与上面的扩展示例相同的数量结果。

const arr1 = [1,2,3];Const Arr2 = [9,11,13];const nums = arr1.concat(Arr2);

这只是人类因素如何影响代码选择的一个例子。例如,一个被许多不同团队接触过的代码库可能必须保持更严格的标准,而不一定要跟上最新和最好的语法。然后,您将超越主源代码,并考虑工具链中的其他因素,这些因素将使编写该代码的人员的工作变得更容易或更困难。有些代码可以以一种对测试.有代码可以将您带到一个角落中未来的扩展或功能添加.这是代码不太表情,不是处理不同的浏览器,或无法访问.所有这些因素都进入了建议专家2。

专家2还考虑了命名的影响。但让我们说实话他们大多数时候我都做错了。

结论# section6

专家不使用每种规格来证明自己;他们证明自己通过了解规范,足以使粗略地部署语法并做出良好的决策。这就是专家如何成为乘数 - 他们如何制作新专家。

那么,这对我们这些自认为是专家或有抱负的专家来说意味着什么呢?这意味着编写代码需要问自己很多问题。这意味着要以一种真实的方式考虑你的开发者受众。您所能编写的最好的代码是能够完成一些复杂的事情的代码,但是这些代码本质上是被检查代码库的人所理解的。

不,这并不容易。并且常常没有明确的答案。但这是你应该用你写的每个功能考虑的事情。

关于作者

劳里巴斯

Laurie Barth是JavaScript专家和技术教育家。当她不写代码的时候,你可以看到她在搭乐高积木,和她的狗Avett在一起。

暂无评论

有什么要说的吗?

我们已经关闭了评论功能,但是你可以看到在我们关闭评论功能之前人们都说了些什么。

从阿拉巴马州

保持你的设计思路新鲜

在这段出自《RECOGNIZE》第二卷的摘录中,Regine Gilbert提供了一个有用的助记方法,帮助我们从一个全新的角度来看待我们的设计工作:“WOQE”,用于观察、观察、提问和探索。