过多使用“if”语句是不好的编程习惯吗?

15

我想知道我是否使用过多的if/else if语句。我正在使用JavaScript编写井字棋程序,并使用大约9个if语句来确定计算机是否应该阻止玩家,以及在确定是否有三行时使用大约9个if语句。

例如:

if(r1c1V === xOrO && r1c2V === xOrO && r1c3V === xOrO)
{
    is3InARow = true;
}
else if(r2c1V === xOrO && r2c2V === xOrO && r2c3V === xOrO)
{
    is3InARow = true;
}
else if(r3c1V === xOrO && r3c2V === xOrO && r3c3V === xOrO)
{
    is3InARow = true;
}
.
.
.
.

等等,我的问题是,我是否使用了太多的if语句?还是说没有更好的方法来做这件事? 我的朋友告诉我,我不应该使用那么多的if语句,但我不确定他是否正确,我可以理解在某些情况下它会变慢或不好,但我不确定。

提前感谢!


这不是糟糕的编程,它取决于逻辑。您可以尝试将这些组合存储在数组中,然后循环遍历,但在所有情况下,您都必须进行这些检查。 - Hacketo
8个回答

16

这个问题比较主观,所以不太适合在Stack Overflow上发布。

你的朋友可能是在建议,使用长if/else语句、嵌套的if语句等编写的程序有时很难维护,并且不总是很易读。有时可以用单独的函数来替换冗长的if语句,这样会更易于维护。

例如,在井字棋中:

function checkRow(rowToCheck){
    if (rowToCheck[0] === rowToCheck[1] && rowToCheck[1] === rowToCheck[2]){
        return true;
    } else {
        return false;
    }
}

并不是说这是完美的或者甚至是好的代码,但你可以看到它如何帮助你减少代码中 if 语句的数量。它还可以被进一步改进:

function checkRow(rowToCheck){
    var allMatch = true;
    for (var i=0;i<rowToCheck.length && allMatch;i++){
        allMatch = rowToCheck[i] === rowToCheck[0];
    }
    return allMatch;
}

这允许行长度不同,并减少了if语句的使用。无论如何,我希望这解释了一些可以消除if语句的方法。


编辑

更进一步地说,在未来,我建议有另一种更好的方式来检查行中元素的相等性:

const o = 'o'
const x = 'x'

const rows = [
  [o, x, x],
  [x, x, x],
  [o, o, x]
]

const rowIsEqual = row => !row
  .some(square => square !== row[0])
  
const results = rows.map(rowIsEqual)
  
console.dir(results)


4

编程的关键是自动化过程。我不会说你现在的做法是错误的,如果它能够工作,那就没问题。但当然,如果你能找到一种方式让它自动地检查所有的东西,那么它就更美好了。例如循环遍历所有的x坐标并检查它们是否都被选中。这可能不是更容易的方法,但它将更加可扩展。如果你想在一个十行十列的网格上玩游戏,那么你只需要说明这个场地的大小即可。而现在则需要添加所有其他的代码。


7
"如果能运行,就可以了" 是你可以给程序员的最糟糕的建议。 - Pouya Ataei

2

没有硬性规定。请记住,&&||短路运算符,这意味着一旦结果已知,就会停止评估。而且你可以按任何顺序排列if语句,这意味着你可以通过考虑经常比较的内容来优化它们。

始终要做最清晰的事情,如果性能至关重要,请选择最快的方式。


2
总的来说,“太多”的if结构是不好的。可以使用if语句解决任何问题,但你所看到的一切如函数编程、递归和对象建模,都是为了防止if的失控,避免代码过于复杂难懂。与其担心序列的长度,应该更关注嵌套if的深度。如果你想看看真正聪明的代码,可以参考Rosetta Code上的井字棋例子。

哇!看看这个 JavaScript 解决方案,告诉我这不是很多的 'if' 语句。 - LaravelSucks

0
这么多应用程序都是使用长长的if-else语句构建的?为什么不使用字典呢?查找关键词并执行相关操作会更好。我很惊讶,我找不到一个简单的Python库,可以支持包括数据库在内的多个后端实现这一功能。

1
我认为这里的答案可能是一个规则引擎。 - Micheal Bee

-1

我猜测使用太多的if-else语句会降低程序的可读性。你可以使用switch-case语句来代替if-else语句。只需在JavaScript中搜索switch-case,你就会得到许多有用的链接,以便了解它。


-1
在您的情况下,这并不算坏事。如果可能的话,您可以在代码中添加return,以便它不会执行其他条件...但仅限于您的情况下。

由于这些是“else if”,如果其中一个为真,则不会检查其他语句。 - Hacketo

-4
在这些情况下,我们使用 '递归'。
回答你的问题:如果你使用太多的if语句,那么你做错了什么。你可以使用其他方法来达到你想要的目标。
例如: 你有一个2x2的网格(0、1、2和0、1、2)。所以你应该创建一个计算分数的算法。一个非常流行的算法是MiniMax

我不明白这个回答如何解决问题。解释会在很大程度上避免进一步的踩分。 - spender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接