为什么你想在一系列 if 语句中使用 switch 块?

switch 语句似乎做同样的事情,但需要更长时间才能输入。

有帮助吗?

解决方案

与大多数事情一样,您应该根据上下文选择使用哪些内容,从概念上讲,这是正确的方法。开关实际上是在说“根据这个变量值选择其中一个”。但if语句只是一系列布尔检查。

举个例子,如果你这样做:

int value = // some value
if (value == 1) {
    doThis();
} else if (value == 2) {
    doThat();
} else {
    doTheOther();
}

这将更好地表示为开关,因为它然后立即明显地基于“值”的值发生了动作的选择。而不是一些任意的测试。

另外,如果您发现自己正在编写开关和if-elses并使用OO语言,那么您应该考虑去除它们并使用多态来实现相同的结果。

最后,关于切换需要更长时间打字,我不记得是谁说了但是我曾经读过一个人问过“你的打字速度真的是影响你编码速度的因素吗?” (转述)

其他提示

如果要切换单个变量的值,那么我每次都会使用一个开关,这就是构造的内容。

否则,坚持使用多个if-else语句。

关于可读性:

我通常更喜欢if / else构造而不是switch语句,特别是在允许掉落情况的语言中。我经常发现的是,随着项目的老化,以及多个开发人员的参与,您将开始构建switch语句。

如果他们(语句)变得简单,许多程序员变得懒惰,而不是阅读整个语句来理解它,他们只会弹出一个案例来涵盖他们在语句中添加的任何情况。

我已经看到很多情况下代码在switch语句中重复,因为一个人的测试已经被覆盖,一个简单的降低情况就足够了,但是懒惰迫使他们在最后添加冗余代码而不是尝试了解开关。我也看到了一些噩梦般的转换语句,其中许多案例构造不良,只是试图遵循所有的逻辑,许多落入案件分散在各处,而许多案件并非如此,变得困难......哪种导致了我所谈到的第一个/冗余问题。

理论上,if / else结构可能存在同样的问题,但实际上这似乎并不经常发生。也许(只是猜测)程序员被迫更仔细地阅读,因为你需要了解在if / else构造中测试的更复杂的条件?如果你正在写一些简单的东西,你知道其他人可能永远不会碰,而你可以很好地构建它,那么我想这是一个折腾。在这种情况下,任何更具可读性和最佳感觉的东西都可能是正确答案,因为您可能会维持该代码。

关于速度:

切换语句的执行速度通常比if-else结构快(但并非总是如此)。由于switch语句的可能值是事先布局的,因此编译器能够通过构造跳转表来优化性能。每个条件都不必像在if / else结构中那样进行测试(好吧,直到找到正确的结构,无论如何)。

然而,情况并非总是如此。如果你有一个简单的开关,比如说,可能的值为1到10,那就是这种情况。您添加的值越多,跳转表就越大,切换效率越低(不是if / else,但效率低于相对简单的switch语句)。此外,如果值是高度变化的(即,而不是1到10,您有10个可能的值,例如1,1000,10000,100000,依此类推到100000000000),那么交换机的效率低于更简单的情况

希望这有帮助。

我个人更喜欢在过多的嵌套if-elses上看到switch语句,因为它们更容易阅读。对于显示状态,开关在可读性方面也更好。

另见本文中关于 pacman ifs

这在很大程度上取决于具体情况。我认为如果有许多嵌套的 if-elses ,我应该在 if-else 上使用 switch

问题是有多少人?

昨天我问自己同样的问题:

public enum ProgramType {
    NEW, OLD
}

if (progType == OLD) {
    // ...
} else if (progType == NEW) {
    // ...
}

if (progType == OLD) {
    // ...
} else {
    // ...
}

switch (progType) {
case OLD:
    // ...
    break;
case NEW:
    // ...
    break;
default:
    break;
}

在这种情况下,第一个 if 进行不必要的第二次测试。第二个感觉有点不好,因为它隐藏了新的。

我最终选择了 switch ,因为它只是读得更好。

切换语句更容易阅读和维护,请放下手。而且通常更快,更不容易出错。

每次在一个变量上有超过2个条件时使用开关,例如,如果每个工作日有不同的操作,则应使用开关。

其他情况(多个变量或复杂的if子句你应该使用Ifs,但没有关于在哪里使用的规则。

我经常认为使用elseif并通过案例实例(语言允许的地方)是代码气味,如果不是气味。

对于我自己,我通常发现嵌套(if / then / else)s通常比elseifs更好地反映事物,而且对于互斥的情况(通常是一个属性组合优先于另一个),情况或类似情况两年后更清楚。

我认为Rexx使用的 select 语句是如何做“案例”的一个特别好的例子。好吧(没有闯入)(愚蠢的例子):

Select
    When (Vehicle ¬= "Car") Then
        Name = "Red Bus"
    When (Colour == "Red") Then
        Name = "Ferrari"
    Otherwise
        Name = "Plain old other car"
    End

哦,如果优化不符合它,那就得到一个新的编译器或语言......

因为打字需要更长的时间而避免使用东西的倾向是一件坏事,试着把它解决掉。也就是说,过于冗长的事情也难以阅读,所以小而简单很重要,但重要的是可读性而不是可写性。简洁的单行通常比简单的3或4行布线更难阅读。

使用最佳描述操作逻辑的构造。

假设您已决定使用switch,因为您只处理可能具有不同值的单个变量。如果这会导致一个小的switch语句(2-3个案例),我会说没问题。如果看起来你会得到更多,我会建议使用多态。这里可以使用AbstractFactory模式创建一个对象,该对象将执行您在交换机中尝试执行的任何操作。丑陋的switch语句将被抽象出来,最终会得到更清晰的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top