为什么您希望在一系列switch
语句中使用if
块?
switch
语句似乎做同样的事情,但需要更长时间才能输入。
答案 0 :(得分:70)
与大多数事情一样,您应该根据上下文选择使用哪些内容,从概念上讲,这是正确的方法。一个开关真的在说“根据这个变量值选择其中一个”,但if语句只是一系列布尔检查。
举个例子,如果你这样做:
int value = // some value
if (value == 1) {
doThis();
} else if (value == 2) {
doThat();
} else {
doTheOther();
}
这可以更好地表示为一个开关,因为它显然立即明确表示根据“值”的值而不是某些任意测试来选择动作。
另外,如果您发现自己正在编写开关和if-elses并使用OO语言,那么您应该考虑去除它们并使用多态来实现相同的结果。
最后,关于切换需要更长时间才能打字,我不记得是谁说了但是我曾经读过一个人问过“你的打字速度真的会影响你编码的速度吗?” (转述)
答案 1 :(得分:43)
如果要切换单个变量的值,那么我每次都会使用一个开关,这就是构造的内容。
否则,坚持使用多个if-else语句。
答案 2 :(得分:12)
我通常更喜欢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),那么交换机的效率低于更简单的情况
希望这有帮助。
答案 3 :(得分:1)
我个人更喜欢在过多的嵌套if-elses上看到switch语句,因为它们更容易阅读。对于显示状态,开关在可读性方面也更好。
另请参阅此帖中关于pacman ifs的评论。
答案 4 :(得分:0)
因为打字需要更长的时间而避免使用东西的倾向是一件坏事,试着把它解决掉。也就是说,过于冗长的事情也难以阅读,因此小而简单很重要,但重要的是可读性而不是可写性。简洁的单行通常比简单的3或4行布线更难阅读。
使用最佳描述操作逻辑的构造。
答案 5 :(得分:0)
每次在一个变量上有超过2个条件时使用开关,例如,如果每个工作日有不同的操作,则应使用开关。
其他情况(多个变量或复杂的if子句你应该使用Ifs,但没有关于在哪里使用的规则。
答案 6 :(得分:0)
这在很大程度上取决于具体情况。我认为,如果有许多嵌套switch
,我应该使用if-else
而不是if-elses
。
问题是有多少人?
昨天我问自己同样的问题:
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
因为它只是读得更好。
答案 7 :(得分:0)
假设您已决定使用switch,因为您只处理可能具有不同值的单个变量。如果这会导致一个小的switch语句(2-3个案例),我会说没问题。如果看起来你会得到更多,我会建议使用多态。这里可以使用AbstractFactory模式创建一个对象,该对象将执行您尝试在交换机中执行的任何操作。丑陋的switch语句将被抽象出来,最终会得到更清晰的代码。
答案 8 :(得分:0)
我经常认为使用elseif并通过案例实例(语言允许的地方)是代码气味,如果不是气味。
对于我自己,我通常发现嵌套(if / then / else)s通常比elseifs更好地反映事物,而且对于互斥的情况(通常是一个属性组合优先于另一个),案例或类似情况两年后更清楚。
我认为Rexx使用的 select 语句是一个特别好的例子,说明如何做好“Case”(没有直通)(愚蠢的例子):
Select
When (Vehicle ¬= "Car") Then
Name = "Red Bus"
When (Colour == "Red") Then
Name = "Ferrari"
Otherwise
Name = "Plain old other car"
End
哦,如果优化不符合它,那就得到一个新的编译器或语言......
答案 9 :(得分:0)
切换语句更容易阅读和维护,请放下手。而且通常更快,更不容易出错。