English 中文(简体)
为什么在“如果X然后返回”之后很少使用“els”?
原标题:Why is "else" rarely used after "if x then return"?

这种方法:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }
    else {
        return s.contains(":)");
    }
}

也可以同样写成:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }

    return s.contains(":)");
}

在我的经验中,第二种形式更经常地显现出来,特别是在较为复杂的方法中(可能有几个这样的出点),而“增长”和“回归”的情况也是如此。 然而,第一种形式可能使得该守则的有条件结构更为明确。 是否有任何理由比其他理由更喜欢?

(有关内容: 职能是否只有一个回报说明?

最佳回答

根据我的经验,这取决于守则。 如果我防范一些事情的话,我确实:

if (inputVar.isBad()) {
    return;
}

doThings();

这一点很清楚: 如果这一说法不实,我不想继续履行这一职能。

而另一方面,有一些职能有多种选择,在这种情况下,我要说:

if (inputVar == thingOne) {
    doFirstThing();
} else if (inputVar == secondThing) {
    doSecondThing();
} else {
    doThirdThing();
}

即使可以写成:

if (inputVar == thingOne) {
    doFirstThing();
    return;
}
if (inputVar == thingTwo) {
    doSecondThing();
    return;
}
doThingThree();
return;

这实际上表现在哪一种方式最清楚地表明了该法典正在做些什么(不一定是哪一种守则范围最短或最不耐烦)。

问题回答

else in that case will be Double, as well as forced extradentation for the main Code of the function”。

你们会看到这一点:

if (condition) {
    return var;
}
// by nature, when execution reaches this point, condition can only be false,
// therefore, the else is unnecessary
return other_var;

在大多数时候,添加其他条款不仅在这种情形下是不必要的,而且在很多时候,它被汇编者带走了timopized off

• 考虑计算机如何考虑这一代码(根据机器编码,为示范目的而简化成假编码):

0x00: test [condition]
0x01: if result of test was not true, goto [0x04]
0x02: push [var] onto stack
0x03: goto [0x05]
0x04: push [other_var] onto stack
0x05: return from subroutine

该代码(但是一种假编码,而不是组装)将按规定使用<条码>。

许多人认为,一种坏和(或)混淆不清的做法可能会有多种可能的出处,以便发挥一种功能,因为方案者必须通过自己的法典来考虑一切可能的道路。 另一种做法是:

return (condition) ? var : other_var;

这简化了该法典,并不产生任何新的出境点。

我倾向于这样写:

boolean containsSmiley(String s) {
    return s != null && s.contains(":)");
}

<>代码>e为多余。 还有一些电算系统和分析工具(或许是FindBugs),可能把这种警告或错误列为警告或错误,因此在这种情况下,方案制定者有可能予以撤销。

与任何关于编码风格的“讨论”一样,没有正确的答案。 我更倾向于适用这些考虑:

  1. 守则是否按预期在所有情况下运作。 (最少惊讶的原则)

  2. 下一个开发商(自己或他人)能够理解它正在做的事情和原因。

  3. 变化法如何脆弱。

  4. 这很简单,需要而且不再需要。 I.e. 停工或停工。

我很高兴我已经满足了上述要求,但其余情况一般都符合规定。

另有一些人可能已经注意到这一点,但我建议,在预计扼杀的情况下,不要使用无效价值。 如果你真的想要检查防止某个人通过无效价值,那么你可以(在发展中时间)或单位测试(试验):

boolean containsSmiley(String s) {
    assert s != null : "Quit passing null values, you moron.";
    return s.contains(":)");
}

我已转向一条总则:永远不会。 放弃价值,除非外部APIC明确要求。 第二: 如果一种外部方法可以恢复无效价值,则代之以合理的非核价值(例如空洞),或添加一个子检查。 我的病情是再重复的<代码>if(thing = 无) 检查。

但是,这只是一个遥远的地方。 我喜欢把短期条件放在顶级和警卫条款上,如果方案流动决定它永远不会到那里去,则取消其他条件。

我倾向于第一种选择,因为它更适合人类。

相比之下,接下来的两句比较:“如果今天降雨,则采取总括措施,否则就只能吃饭,而且“如果今天降雨,则采取总括措施,吃饱”。 第一句与问题中的第一组法典相对应,第二组是: 第一个是更加清楚和可读的,是没有?

它带有宗教论点,在事情结束之日。 我甚至认为,第一种形式在某些情况下更容易读。 如果你在<条码>中拥有大量代码,那么首先可以比较容易看出违约回报是什么。

if (s == null) {
    return false;
}
else if (s.Contains(":))")) {
    return true;
}
else if (s.Contains(":-(")) {
    return false;
}

return s.contains(":)");

<if statement is eck/enforcing You treaty/expectation of not received void Value. 出于这一原因,我倾向于认为它不同于其他职能,因为它与你重新努力完成的工作的实际逻辑没有任何关系(尽管情况非常简单)。

不过,在大多数情况下,我更希望守则的意图尽可能明确。 如果你能够调整你的职能,使之更能为他人读用,那么情况就是如此。 作为专业方案者,你的目标应该是为那些在你之后必须保持你的代码的人(包括两年后......)进行规划。 你能够做的帮助是值得的。

造成.。 你们知道,你也可以使用{}来制造若干层次的nes子,但没有人真的要这样做。

虽然其他职能是正确的,在逻辑和可操作性方面没有任何错误,但我想避免最初的WTF时刻,即当该职能在范围外没有回报说明时。

第一种形式不过是粗略的,当你回去价值时,你会自动离开你所恢复的职能范围,回到打电话者手中,那么,此后任何一部守则只有在红十字与红新月联会声明没有评价真实情况之后才会执行。

d 我主张可读性。 如果你重新扫描试图说明守则内容的编码屏幕,就会给开发商带来视觉的信号。

......但并非真正需要,因为我们大家都非常好地评论我们的法典,正确吗?

我认为,第二点更有意义。 如同开关一样,它成为更多的违约行动。 如果它与其他任何出境点相匹配,那么就这样做了。 你们实际上不需要别人。 我要说的是,如果整个职能只是而且否则的话,那么另一个职能就会变得有意义,因为它具有一个巨大的条件。 如果存在多种条件和其他职能,则最终将使用违约回报。

你们可以看到,不同的人对可读性有不同的看法。 有些人认为,法典的行文较少,往往会使法典更加可读。 另一些委员认为,第二种形式的不对称使其更易读。

我认为,这两种观点可能都是正确的......对于持有这些观点的人来说,都是正确的。 由此推论是,你不能写出人人都能最佳阅读的法典。 因此,最佳建议是遵循你规定的编码标准(如果它对此有任何说明的话),并普遍使用你的常识。 (如果你承受一些强烈的要人的负担,他们坚持认为,他的方式是“权利”......只是流动。)

由于在这种情况下使用ec时有选择性的警告(默认的警告);

确实,一些原因只是公约,但上述形式有好处。

在撰写一份返回声明时,典型的做法是,作最后发言,说明拖欠的返回价值。 这主要有助于修复工作——其他条款往往在其他结构中总结,或意外地被深入到树上。

我更喜欢从维护的角度从多个方面撤出一个点。 最终结果可以在一个撤离点而不是一个撤离点加以修改(或予以纠正)。

第二种形式,如果简单易懂。 这并不意味着更清楚。 我建议你做你认为最清楚的事情。 我本人将写。

static boolean containsSmiley(String s) { 
    return s != null && s.contains(":)"); 
} 

因为它与撰写其中一份文件相同,其中提供了方案人意图的证据:

boolean containsSmiley(String s) {
    if (s == null)   // The curly braces are not even necessary as the if contains only one instruction.
        return false;

    return s.contains(":)");
}

甚至:

boolean constainsSMiley(String s) {
    return string.IsNullOrEmpty(s) ? false : s.Contains(":)");
}

这两种形式是:

  1. More elegant;
  2. Easier to read;
  3. Leaner and swifter for the reading programmer.




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签