为什么要switch
在一系列if
语句中使用块?
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结构中正在测试的更复杂的条件?如果你正在写一些简单的东西,你知道其他人可能永远不会碰,而你可以很好地构建它,那么我想这是一个折腾.在这种情况下,任何更具可读性和最好的方法都可能是正确的答案,因为您可能会维持该代码.
Switch语句通常比if-else结构执行得更快(但并非总是如此).由于switch语句的可能值是事先布局的,因此编译器能够通过构造跳转表来优化性能.每个条件都不必像在if/else结构中那样进行测试(好吧,直到找到正确的结构,无论如何).
然而,情况并非总是如此.如果你有一个简单的开关,比如说,可能的值为1到10,那就是这种情况.您添加的值越多,跳转表越大,切换效率越低(不是if/else,但效率低于相对简单的switch语句).此外,如果值是高度变化的(即,而不是1到10,您有10个可能的值,例如1,1000,10000,100000,依此类推到100000000000),那么交换机的效率低于更简单的情况.
希望这可以帮助.