作家
登录

如何写出小而清晰的函数?(JS 版)

作者: 来源: 2017-08-11 14:47:32 阅读 我要评论

  •  
  • let myMap = new Map([ ['functionKey'function() {}] ]);   
  •  
  • let myObject = { 'stringKey''Hello world' };   
  •  
  • getCollectionWeight(myArray);  // => 7 (1 + 4 + 2)   
  •  
  • getCollectionWeight(myMap);    // => 4   
  •  
  • getCollectionWeight(myObject); // => 2  
  • 每一个函数的简单清楚明了。你不须要花费时光去发掘代码,懂得代码的工作。这就是清爽版代码该有的样子。

    Step 3: 优化永无尽头

    就算到了如今这种程度,依然有很大年夜优化的空间!

    你可以创建一个自力的函数 getCollectionValues(),应用 if/else 语句区分集合中的类型:

    如今再来看 getCollectionWeight() 函数,你会发明已经比较轻易明白它的机理,看起来就像一段有趣的故事。

    那么, getCollectionWeight() 应当会变得异常纯粹,因为它独一的工作:用 getCollectionValues() 获得集合中的值,然后依次调用乞降累加器。

    你也可以创建一个自力的累加器函数:

    1. function reduceWeightSum(sum, item) { 
    2.  
    3.   return sum + getWeightByType(item); 
    4.  
    5.  

    幻想情况下 getCollectionWeight() 函数中不该该定义函数。

    除了这些代码质量上的优化之外,你也获得不少其他的好处:

    • 经由过程代码自文档,getCollectionWeight() 函数的可读性获得很大年夜晋升。
    • getCollectionWeight() 函数的长度大年夜幅削减。
    • 如不亚妹计算寂?驿他类型的权重值,getCollectionWeight() 的代码不会再激烈膨胀了。
    • 这些拆搀扶来的函数都是低耦合、高可复竽暌姑的组件,你的同事可能欲望将他们导入其他项目中,而你可以易如反掌的实现这个请求。
    • 当函数偶发缺点的时刻,调用栈会加倍具体,因为栈中包含函数的名称,甚至你可以立马发明掉足的函数。
    • 这些小函数更简单、易测试,可以达到很高的代码覆盖率。与其穷尽各类场景来测试一个大年夜函数,你可以进行构造化测试,分别测试每一个小函数。
    • 你可以参照 CommonJS 或 ES2015 模块格局,将拆搀扶的函数创建为自力的模块。这将使得你的项目文件更轻、更构造化。

    这些建议可以赞助你,克服应用的复杂性。

    原则上,你的函数不应当跨越 20 行——越小越好。

    如今,我认为你可能会问我如许的问题:“我可不想将每一行代码都写为函数。有没有什么准则,告诉我何时应当停止拆分?”。这就是接下来的议题了。

    2. 函数应当是简单的

    让我们稍微放松一下,思虑下应用的定义到底是什么?

    每一个应用都须要实现一系列需求。开辟人员的准则在于,将这些需求拆分为一些列较小的可履行组件(定名空间、类、函数、代码块等),分别完成指定的工作。

    一个组件又由其他更小的组件构成。如不雅你欲望编写一个组件,你只能大年夜抽象层中低一级的组件中,拔取须要的组件用于创建本身的组件。

    换言之,你须要将一个函数分化为若干较小的步调,并且包管这些步调都在抽象上,处于同一级别,并且只向下抽象一级。这异常重要,因为这将使得函数变得简单,做到“做且只做好一件事”。

    为什么这是须要的?因为简单的函数异常清楚。清楚就意味着易于懂得和修改。

    我们来举个例子。假设你须要实现一个函数,使数组仅保存素数(2, 3, 5, 7, 11 等等),移除非素数(1, 4, 6, 8 等等)。函数的调用方法如下:

    1. getOnlyPrime([2, 3, 4, 5, 6, 8, 11]); // => [2, 3, 5, 11] 

    若何用低一级抽象的若干步调实现 getOnlyPrime() 函数呢?我们如许做:

    避免应用包含大年夜量的功能的大年夜函数,应当将其功能瓜分为若干较小的函数。大年夜的黑盒函数难于懂得、修改,特别是很难测试。

    为了实现 getOnlyPrime() 函数, 我们用 isPrime() 函数来过滤数组中的数字。

    异常简单,只须要对数字数组履行一个过滤函数 isPrime() 即可。

    你须要在当前抽象层实现 isPrime() 的细节吗?不,因为 getOnlyPrime() 函数会在不合的抽象层实现一些列步调。不然,getOnlyPrime() 会包含过多的功能。

    在脑筋中谨记简单函数的理念,我们来实现 getOnlyPrime() 函数的函数体:


    1.   推荐阅读

        安全36计 你需要了解的那些安全术语

      【51CTO.com快译】 软件开辟中的安然主题是多种多样的,安然术语对不合的团队具有不合的含义。为赞助澄清问题和避免安然问题的混淆,小编列出了A-Z最重要的安然相干词条供你参考。 A>>>详细阅读


      本文标题:如何写出小而清晰的函数?(JS 版)

      地址:http://www.17bianji.com/lsqh/36650.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)