当前位置:  开发笔记 > 编程语言 > 正文

何时使用if-else if-else over switch语句,反之亦然

如何解决《何时使用if-elseif-elseoverswitch语句,反之亦然》经验,为你挑选了3个好方法。

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

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



1> tddmonkey..:

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

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

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

这将更好地表示为一个开关,因为它显然立即明确表示根据"值"的值而不是某些任意测试来选择动作.

此外,如果您发现自己编写开关和if-elses并使用OO语言,您应该考虑去除它们并使用多态来实现相同的结果(如果可能).

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


使其更具可读性(并且在交换机中看起来很好)的另一种方法是使用Enumerations而不是任意int值
枚举不是PHP本机的,但可以在本主题中看到入侵:http://stackoverflow.com/questions/254514/php-and-enums

2> Garry Shutle..:

如果你打开一个变量的值,那么我每次都会使用一个开关,这就是构造的内容.

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


这真是一个非常简单而全面的答案.

3> Allen Ratcli..:

关于可读性:

我通常更喜欢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),那么交换机的效率低于更简单的情况.

希望这可以帮助.


@Frederick使用跳转表时,表中所需的条目数取决于最低和最高`case`值之间的差异:必须有`high - low + 1`条目.如果你有`case 0`,`case 1`和`case 100`,那么表中必须有101个条目,尽管只有三个`case`语句.由于表中的每个条目都增加了编译方法的大小,因此当`case`值稀疏分布时使用查找表是没有意义的.查找表更适合密集分发.
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有