# 1 楼答案 if(A) { }else if(B) { }else if(C) { }else if(D) { }else { } 所有的if仍然需要进行“计算”,使其类似于“O(n)”。应尽可能避免使用switch(Lalala)
# 3 楼答案 那么,我必须回过头来问的问题是,“相对于什么” 如果您的意思是与switch语句相反,那么除了可读性之外,它有时也会更有效。作为一项规则(当然是在C#中,很可能在其他分支中),在编译时,低于一定数量的分支只会转换为一系列if语句,但超过该数量时,它将转换为基于哈希的查找和跳转,这在平均情况下可能更快 或者,如果您对不同情况的相对频率有很好的了解,那么使用一组if语句可以提高效率。例如,如果95%的案例与第一个分支匹配,4%与第二个分支匹配,1%与所有其他分支匹配,则通过进行单个比较,甚至可能不进行分支,这可以为95%的案例提供更好的性能 所以可能在这种情况下会提高效率 尽管如此,可读性仍然非常重要。作为一个极端的例子,有一种图灵完备语言,它的设计只是为了看看一种图灵完备语言的编译器有多小。它的设计者将语言命名为“brainf**k”。这本身就是对可读代码在实际编程中的重要性的一个重要评论 现在,大量if语句的一个更大的问题是,它通常表示您正在通过那些if语句建模,而这些if语句可以通过类层次结构更好地建模。在某种程度上,这只是可读性的另一种表现(假设程序以任何一种方式工作)。然而,它关系到整个程序的可读性和可理解性。它将极大地影响你对程序的心智模型、可扩展性,不仅影响你对它的维护程度,还影响你对它的设想。它很容易成为一个程序的区别,一个是在有人想出如何摆脱它之前成为遗留时间接收器,另一个是不断增长以继续提供投资回报
# 4 楼答案 丘斯达是对的。交换机结构优于多if-else。下一种方法是使用enum作为开关键。在这种情况下,如果忘记在交换机中提及某个枚举元素,则会收到警告 但如果您使用的是enum和switch,请继续进行更好的设计:完全删除switch 在枚举中声明抽象业务方法。为每个枚举元素实现它。调用枚举元素。方法()而不是实现开关 这里有一个例子 enum Foo { ONE { public void foo() { // do something } }, TWO { public void foo() { // do something } }, ; public abstract void foo(); } 以下是使用此选项的代码: Foo.valueOf(System.getProperty("foo")).foo(); 将此行与以下内容进行比较: String foo = System.getProperty("foo"); if("ONE".equals(foo)) { //..... } else if("ONE".equals(foo)) { //..... } else { //..... } 我认为不需要任何评论
# 6 楼答案 如果一个接一个地有很多If语句,那么switch-case语句更有用。对于每个可能的inut,它至少有一个固定的响应时间,因为它不需要遍历所有if语句 很多if(and else)语句通常表示 a)Violation of Single responsibility Principle b)需要重构为Strategy Design Pattern
# 1 楼答案
所有的
if
仍然需要进行“计算”,使其类似于“O(n)”。应尽可能避免使用switch(Lalala)
# 2 楼答案
有时由于处理器体系结构的原因,找到一种完全避免分支的方法更有效;这可能被认为是
if
语句的一个缺点# 3 楼答案
那么,我必须回过头来问的问题是,“相对于什么”
如果您的意思是与switch语句相反,那么除了可读性之外,它有时也会更有效。作为一项规则(当然是在C#中,很可能在其他分支中),在编译时,低于一定数量的分支只会转换为一系列if语句,但超过该数量时,它将转换为基于哈希的查找和跳转,这在平均情况下可能更快
或者,如果您对不同情况的相对频率有很好的了解,那么使用一组if语句可以提高效率。例如,如果95%的案例与第一个分支匹配,4%与第二个分支匹配,1%与所有其他分支匹配,则通过进行单个比较,甚至可能不进行分支,这可以为95%的案例提供更好的性能
所以可能在这种情况下会提高效率
尽管如此,可读性仍然非常重要。作为一个极端的例子,有一种图灵完备语言,它的设计只是为了看看一种图灵完备语言的编译器有多小。它的设计者将语言命名为“brainf**k”。这本身就是对可读代码在实际编程中的重要性的一个重要评论
现在,大量if语句的一个更大的问题是,它通常表示您正在通过那些if语句建模,而这些if语句可以通过类层次结构更好地建模。在某种程度上,这只是可读性的另一种表现(假设程序以任何一种方式工作)。然而,它关系到整个程序的可读性和可理解性。它将极大地影响你对程序的心智模型、可扩展性,不仅影响你对它的维护程度,还影响你对它的设想。它很容易成为一个程序的区别,一个是在有人想出如何摆脱它之前成为遗留时间接收器,另一个是不断增长以继续提供投资回报
# 4 楼答案
丘斯达是对的。交换机结构优于多if-else。下一种方法是使用enum作为开关键。在这种情况下,如果忘记在交换机中提及某个枚举元素,则会收到警告
但如果您使用的是enum和switch,请继续进行更好的设计:完全删除switch
在枚举中声明抽象业务方法。为每个枚举元素实现它。调用枚举元素。方法()而不是实现开关
这里有一个例子
以下是使用此选项的代码:
将此行与以下内容进行比较:
我认为不需要任何评论
# 5 楼答案
每次编写if/else都会增加必须测试的代码路径数
# 6 楼答案
如果一个接一个地有很多If语句,那么switch-case语句更有用。对于每个可能的inut,它至少有一个固定的响应时间,因为它不需要遍历所有if语句
很多if(and else)语句通常表示
a)Violation of Single responsibility Principle
b)需要重构为Strategy Design Pattern