为什么大多数程序员更喜欢使用 if-else 而不是 switch?
最近,我在审查代码时发现了一件有趣的事情。似乎大多数程序员更倾向于使用 if-else 而不是 switch!
一般来说,如果有 3 个或更多的 else-if 分支,你应该考虑使用 switch。如果有 10 个或更多的条件分支,你应该考虑使用配置变量或文件,并为此配置编写一个特定的函数来进行映射。如果映射逻辑复杂但使用频繁,你可以考虑创建一个专门的规则引擎或 DSL 来处理这个问题。
有很多明显的地方 switch 更合适,但开发者却使用 if-else。这让我感到好奇,因此我决定研究这个问题。
开发过程
很多时候,代码不是一次性开发的,一段代码往往是由多个开发者在不同时间开发和修改的。
一个具有多个分支的判断语句通常不是一次性编写的,而是每当添加新需求时就会添加一个新分支。对于每个添加分支的人来说,他们并不觉得自己有责任重构整个代码,因为他们只是想以最低的成本完成自己想做的事情,因此代码质量变得越来越低。
我曾接手一段代码,遇到了一个嵌套了 20 多个 if-else 的模块。我在心里咒骂是谁写的玩意,然后开始查看历史。
当第一个程序员编写这段代码时,只有两个 if-else。后来,随着需求逐渐增加,if-else 的数量越来越多,3、4、10、15,最后经过 4 个程序员的修改,这段代码传给了我,变成了这样。
第一个程序员肯定没有预料到如此简单的逻辑会变成如此复杂的模块。因此,问题的根源在于老板或产品经理,而不是程序员。
所以我又添加了两个 else-if,测试、提交并推送。我也懒得重构这段代码。
现实是复杂的
使用 if-else 的另一个原因是,现实世界往往复杂而混乱,代码开发是为了解决现实世界中的问题。
我们的代码需要适应现实世界。switch 的条件只能是同一类型的不同值:
switch (color) {
case "red":
...
case "yellow":
...
case "green":
...
default:
message = "The color is not red, yellow, or green";
}
但在现实世界中遇到的问题是这样的:
if color == Color.RED:
...
elif shape == Shape.RECTANGE:
...
elif height > 6 and color != Color.BLUE:
...
else:
...
因此,编写数学算法和计算机基础框架的人感到高兴,毕竟,数学的世界是明确定义的,具有严谨的逻辑。但一旦你编写业务逻辑代码,就必须面对复杂而混乱的现实世界。而现实世界的问题占据了问题的最高比例,这样的代码也占据了总代码的绝大多数。
Switch 的性能不比 if-else 更好
在早些年,许多人争论 if-else 和 switch 哪个性能更高。
switch 是在 C 语言中设计的,以对应汇编语言的跳转表,目的是自然地实现更多方向的跳转。在这个时候,使用 switch 的性能会高于 if-else。
但现在,今天的编译器足够强大,可以自动将这种情况优化为跳转表,因此编写的 switch 代码在编译后不会比 if-else 具有更高的性能。只要逻辑相同,两者在汇编级别上可能是相同的。
那么,你的选择是什么?