每一个函数的简单清楚明了。你不须要花费时光去发掘代码,懂得代码的工作。这就是清爽版代码该有的样子。
Step 3: 优化永无尽头
就算到了如今这种程度,依然有很大年夜优化的空间!
你可以创建一个自力的函数 getCollectionValues(),应用 if/else 语句区分集合中的类型:
如今再来看 getCollectionWeight() 函数,你会发明已经比较轻易明白它的机理,看起来就像一段有趣的故事。
那么, getCollectionWeight() 应当会变得异常纯粹,因为它独一的工作:用 getCollectionValues() 获得集合中的值,然后依次调用乞降累加器。
你也可以创建一个自力的累加器函数:
- function reduceWeightSum(sum, item) {
- return sum + getWeightByType(item);
- }
幻想情况下 getCollectionWeight() 函数中不该该定义函数。
除了这些代码质量上的优化之外,你也获得不少其他的好处:
- 经由过程代码自文档,getCollectionWeight() 函数的可读性获得很大年夜晋升。
- getCollectionWeight() 函数的长度大年夜幅削减。
- 如不亚妹计算寂?驿他类型的权重值,getCollectionWeight() 的代码不会再激烈膨胀了。
- 这些拆搀扶来的函数都是低耦合、高可复竽暌姑的组件,你的同事可能欲望将他们导入其他项目中,而你可以易如反掌的实现这个请求。
- 当函数偶发缺点的时刻,调用栈会加倍具体,因为栈中包含函数的名称,甚至你可以立马发明掉足的函数。
- 这些小函数更简单、易测试,可以达到很高的代码覆盖率。与其穷尽各类场景来测试一个大年夜函数,你可以进行构造化测试,分别测试每一个小函数。
- 你可以参照 CommonJS 或 ES2015 模块格局,将拆搀扶的函数创建为自力的模块。这将使得你的项目文件更轻、更构造化。
这些建议可以赞助你,克服应用的复杂性。
原则上,你的函数不应当跨越 20 行——越小越好。
如今,我认为你可能会问我如许的问题:“我可不想将每一行代码都写为函数。有没有什么准则,告诉我何时应当停止拆分?”。这就是接下来的议题了。
2. 函数应当是简单的
让我们稍微放松一下,思虑下应用的定义到底是什么?
每一个应用都须要实现一系列需求。开辟人员的准则在于,将这些需求拆分为一些列较小的可履行组件(定名空间、类、函数、代码块等),分别完成指定的工作。
一个组件又由其他更小的组件构成。如不雅你欲望编写一个组件,你只能大年夜抽象层中低一级的组件中,拔取须要的组件用于创建本身的组件。
换言之,你须要将一个函数分化为若干较小的步调,并且包管这些步调都在抽象上,处于同一级别,并且只向下抽象一级。这异常重要,因为这将使得函数变得简单,做到“做且只做好一件事”。
为什么这是须要的?因为简单的函数异常清楚。清楚就意味着易于懂得和修改。
我们来举个例子。假设你须要实现一个函数,使数组仅保存素数(2, 3, 5, 7, 11 等等),移除非素数(1, 4, 6, 8 等等)。函数的调用方法如下:
- getOnlyPrime([2, 3, 4, 5, 6, 8, 11]); // => [2, 3, 5, 11]
若何用低一级抽象的若干步调实现 getOnlyPrime() 函数呢?我们如许做:
避免应用包含大年夜量的功能的大年夜函数,应当将其功能瓜分为若干较小的函数。大年夜的黑盒函数难于懂得、修改,特别是很难测试。
为了实现 getOnlyPrime() 函数, 我们用 isPrime() 函数来过滤数组中的数字。
异常简单,只须要对数字数组履行一个过滤函数 isPrime() 即可。
你须要在当前抽象层实现 isPrime() 的细节吗?不,因为 getOnlyPrime() 函数会在不合的抽象层实现一些列步调。不然,getOnlyPrime() 会包含过多的功能。
在脑筋中谨记简单函数的理念,我们来实现 getOnlyPrime() 函数的函数体:
推荐阅读
【51CTO.com快译】 软件开辟中的安然主题是多种多样的,安然术语对不合的团队具有不合的含义。为赞助澄清问题和避免安然问题的混淆,小编列出了A-Z最重要的安然相干词条供你参考。 A>>>详细阅读
本文标题:如何写出小而清晰的函数?(JS 版)
地址:http://www.17bianji.com/lsqh/36650.html
1/2 1