如果函数的大部分执行是以输入为条件的,那么哪一种是更好的实现方式?

时间:2015-11-06 22:54:43

标签: javascript algorithm design-patterns design-principles

我想知道哪些更好,为什么。我经常遇到日常工作中的情况,我喜欢"只要输入不空,这个算法就可以工作。或类似的东西。我通常只是提前return,因为出于某种原因,在if条件下几乎包含整个函数的想法似乎 错误 我。但是,我知道有些宗教不相信早期的return陈述。

示例:

(1)

function combine ( strings , separator )
{
    if ( strings.length > 0 )
    {
       retstring = strings[0];
       for ( var i = 1; i < strings.length; ++ i )
           retstring += (separator + strings[i]);
    }
    return retstring;
}

(2)

function combine ( strings , separator )
{
    if (strings.length === 0) return undefined;   
     retstrings =  strings[0];
     for ( var i = 1; i < strings.length; ++ i )
         retstring += (separator + strings[i]);   
     return retstring;
}

那么在这种情况下哪个更好?

2 个答案:

答案 0 :(得分:1)

我说不是&#34;更好&#34 ;;这是主观的。

而且,与许多主观编程选择不同,这个选择并不仅仅是个人偏好的问题。相反,我认为优秀的程序员将使用这两种模式,根据他们想要表达的内容选择哪种模式。

模式#1说&#34;如果X做Y&#34;。模式#2表示&#34;如果!X,则不做任何其他事情。&#34;不可否认,这两个相当于运行代码的任何浏览器。

但是,对于人类阅读您的代码(例如,必须修改它的同事),每种模式都会对正在发生的事情提出不同的建议。因此,我的建议是尝试确定两种模式中的哪一种最能描述您尝试传达的内容,然后使用它。

例如,许多函数都有&#34;如果这不是相关逻辑&#34;,最好用模式#2表示:

function doStuffIfLoggedIn(user) {
    if (!user.isLoggedIn()) return;

    doStuff();
}

但是,如果提供了特定的选项,那么做某事也相当普遍,并且更适合第一种模式:

function format(word, capitalize) {
    if (capitalize) {
        word = string.toUpperCase();
    }
    returns word;
}

如果其中任何一个同样有效(并且我发现这种情况经常发生)那么它确实归结为偏好。就个人而言,这些都是有效的&#34;我选择#2的情况;在其他条件相同的情况下,它会减少缩进,我(主观地)发现它更容易阅读。

但实际上,重要的是(恕我直言)要考虑你的代码如何看待后来的人(甚至可能是你,一年后,当你忘记了为什么你写它时办法)。浏览器无论如何都不关心,你的同事将能够理解其中任何一个,但使用最能代表情况的浏览器可以为任何阅读它的人提供关于代码功能的关键线索后面。

修改

关于你的观点:

  有些宗教不相信早期的回复陈述

我认为有一个想法是多个return语句可以使代码更复杂。当你的函数有很多退出方法时,它很难理解它的逻辑,因为要解释后一部分,你必须推断是否有任何早期部分阻止你到达那里。

然而,Stack Overflow的共识是,虽然避免过多return语句是个好主意,但正确使用一些语句可以使您的代码更多可读,从而是一个好主意。

请参阅: Should a function have only one return statement?

答案 1 :(得分:0)

有一种内置数组方法可以完成您的功能: join()

function combine(strings, separator) {
  return strings.join(separator);
}

console.log(combine(['this','is','a','test'], '...')); //this...is...a...test

但如果join()不存在,我建议您修改第一个代码。您不必显式返回undefined。如果您不包含return语句,该函数将自动返回undefined

function combine(strings, separator) {
  if (strings.length) {
    var retstring = strings[0];
    for (var i = 1; i < strings.length; ++i)
      retstring += (separator + strings[i]);
    return retstring;
  }
}

console.log(combine(['this','is','a','test'], '...')); //this...is...a...test

console.log(combine([], '...'));  //undefined