gpt4 book ai didi

if-statement - 没有 if 语句的编程?

转载 作者:行者123 更新时间:2023-12-03 23:51:05 26 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




我记得一段时间(可能是几年)前,我在 Stackoverflow 上读到了关于使用尽可能少的 if 测试进行编程的魅力。 This question有点相关,但我认为压力在于使用许多小函数,这些函数返回由测试确定的值,具体取决于它们收到的参数。一个非常简单的例子是使用这个:

int i = 5; 
bool iIsSmall = isSmall(i);

isSmall()看起来像这样:
private bool isSmall(int number)
{
return (i < 10);
}

而不是仅仅这样做:
int i = 5;
bool isSmall;
if (i < 10) {
isSmall = true;
} else {
isSmall = false;
}

(从逻辑上讲,这段代码只是示例代码。它不是我正在制作的程序的一部分。)

我相信这样做的原因是因为它看起来更好,并且使程序员更不容易出现逻辑错误。如果正确应用此编码约定,您将在任何地方几乎看不到 if 测试,除非在其唯一目的是进行该测试的函数中。

现在,我的问题是:有没有关于这个约定的文档?有没有地方可以看到这种风格的支持者和反对者之间的激烈争论?我尝试搜索向我介绍此内容的 Stackoverflow 帖子,但我再也找不到了。

最后,我希望这个问题不会被否决,因为我不是在寻求解决问题的方法。我只是希望能听到更多关于这种编码风格的信息,并且可能会提高我将来会做的所有编码的质量。

最佳答案

我从来没有听说过这样的对流。无论如何,我不明白它是如何工作的。当然,拥有 iIsSmall 的唯一意义是稍后对其进行分支(可能与其他值结合使用)?

我听说的是避免使用像 iIsSmall 这样的变量的论点。 完全 . iIsSmall只是存储您所做的测试的结果,以便您以后可以使用该结果做出决定。那么为什么不直接测试 i 的值呢?在您需要做出决定的时候?即,而不是:

int i = 5; 
bool iIsSmall = isSmall(i);
...
<code>
...
if (iIsSmall) {
<do something because i is small>
} else {
<do something different because i is not small>
}

写吧:
int i = 5
...
<code>
...
if (isSmall(i)) {
<do something because i is small>
} else {
<do something different because i is not small>
}

这样你就可以在分支点知道你实际分支的是什么,因为它就在那里。无论如何,在这个例子中这并不难,但如果测试很复杂,你可能无法在变量名中编码整个事情。

它也更安全。 iIsSmall 这个名字没有危险具有误导性,因为您更改了代码以便测试其他内容,或者因为 i在您调用 isSmall 后实际上已更改这样它就不再一定很小了,或者因为有人刚刚选择了一个愚蠢的变量名等等。

显然,这并不总是有效。如果 isSmall测试很昂贵,您需要多次对其结果进行分支,您不想多次执行它。您也可能不想多次复制该调用的代码,除非它是微不足道的。或者您可能希望返回标志以供不知道 i 的调用者使用。 (尽管那时您可以只返回 isSmall(i) ,而不是将其存储在变量中然后返回变量)。

顺便说一句,单独的函数在您的示例中没有任何保存。您可以包括 (i < 10)在对 bool 的分配中变量就像 bool 中的 return 语句一样容易功能。即你可以很容易地写 bool isSmall = i < 10; - 正是 this 避免了 if 语句,而不是单独的函数。 if (test) { x = true; } else { x = false; } 形式的代码或 if (test) { return true; } else { return false; }总是很傻;只需使用 x = testreturn test .

关于if-statement - 没有 if 语句的编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com