Better: switch-case or if-else?
Possible Duplicate:
If/Else vs. Switch
我这里有两个代码,我只是想问两个代码中哪一个在可写性(代码的易写性)和可读性(代码的易理解性)方面更好。
开关盒:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.io.*; public class Quarter{ public static void main(String[] args){ int day; String input=""; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Input a number from 1 to 3:"); try{ input=in.readLine(); }catch(IOException e){ System.out.println("Error!"); } day=Integer.parseInt(input); switch(day){ case 1: case 2: case 3: System.out.println("1st Quarter"); break; case 4: case 5: case 6: System.out.println("2nd Quarter"); break; case 7: case 8: case 9: System.out.println("3rd Quarter"); break; case 10: case 11: case 12: System.out.println("4th Quarter"); break; default: System.out.println("Error!"); } } } |
如果其他:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.io.*; public class Days{ public static void main(String[] args){ int day; String input=""; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Input a number from 1 to 12:"); try{ input=in.readLine(); }catch(IOException e){ System.out.println("Error!"); } day=Integer.parseInt(input); if(day>=1 && day<=3){ System.out.println("1st Quarter"); }else if(day>=4 && day<=6){ System.out.println("2nd Quarter"); }else if(day>=7 && day<=9){ System.out.println("3rd Quarter"); }else if(day>=10 && day<=12){ System.out.println("4th Quarter"); }else System.out.println("Error!"); } } |
我也不想这样做:
1 2 3 4 5 6 7 8 9 10 11 12 |
首先避免逻辑分支的需要。表查找通常是一种有用的技术。算术操作也很重要——在你关心的值中寻找一个模式,以及一个将它们转换为更简单的函数。在更复杂的情况下也要考虑多态性。
如果您以相同的方式处理所有异常,那么在相同的地方进行处理。
尽可能严密地限定变量的范围。
提示输入实际需要的值,ffs。:)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Quarter { public static void main(String[] args) { try { System.out.print("Input the month number (1 = January, 2 = February ... 12 = December):"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int month = Integer.parseInt(in.readLine()); int quarter = (month - 1) / 3; String[] quarters = new String[]{"1st","2nd","3rd","4th" }; System.out.println(quarters[quarter] +" Quarter"); } catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range System.out.println("Error!"); } } } |
你喜欢哪一个?这是你的密码。
我当然更喜欢开关盒,但是如果你有一些组合的东西,比如"大于"开关盒不是正确的方法。
另一件事:我会像下面这样写开关箱,因为我认为最好阅读:
1 2 3 4 5 6 7 8 |
安德烈亚斯
1 2 3 4 5 |
我不清楚这个问题是关于特定代码示例的解决方案,还是关于总体结构。所以,如果其他方法的一些优点需要考虑。
如果else在代码中更常见,因为交换机接受的数据类型是有限的,交换机本身也是有限的。编译时间值。更熟悉的是更好的可读性更广泛的受众。
如果你发现需求不断变化,您需要支持不同的数据类型。我不得不把枚举上的很多开关改成字符串比较我的时间,当有人添加了一个要求,用户能够配置选项。
需要使用断路器;正确的内部开关引入偶尔会出现一些奇怪的错误,这些错误只会出现在角落的案例中,开关变大变复杂。
当然,作为一个企业程序员,我会创建一个TimeUnitSubvisionResolvingVisitor…:)
如何:
1 2 3 4 |
;)
你也可以这样做:
1 2 3 4 5 |
我想两者都应该有效。
实现它的另一种方法是通过一个映射。它将使其具有可配置性,特别是当您使用Spring时,如果您决定在bean.xml中设置这个映射变量。
不管怎样,这里有另一种选择:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Map<Integer, String> m = new HashMap<Integer, String>(); m.put(1,"1st Quarter"); m.put(2,"1st Quarter"); m.put(3,"1st Quarter"); m.put(4,"2nd Quarter"); m.put(5,"2nd Quarter"); m.put(6,"2nd Quarter"); m.put(7,"3rd Quarter"); m.put(8,"3rd Quarter"); m.put(9,"3rd Quarter"); m.put(10,"4th Quarter"); m.put(11,"4th Quarter"); m.put(12,"4th Quarter"); System.out.println(m.get(d)); |