2011-07-28 19 views
10

Powiel możliwe:
If/Else vs. SwitchLepiej: switch-case czy czy-else?

mam dwa kody tutaj, ja tylko chciałem zapytać, który z tych dwóch jest lepszy pod względem writability (łatwość pisania kodów) oraz w warunki czytelności (łatwość zrozumienia kodów).

switch-case:

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!"); 
     } 

    } 
} 

if-else:

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!"); 
    } 
} 
+0

Niekoniecznie duplikat jako że jest dla C# i jest to java więc poszukiwacze Java nie byłoby znaleźć oryginalny – Mark

+0

Zauważyłem sporo pytań z prośbą to samo, ale dla innego języka. Może ktoś powinien stworzyć pytanie wiki społeczności i mieć odpowiedź, która obejmuje pytanie dla każdego języka? – Wipqozn

Odpowiedz

36

Ani, zrobiłbym to jedno:

String[] out = { 
    "1st Quarter", 
    "2nd Quarter", 
    "3rd Quarter", 
    "4th Quarter" 
}; 

if (1 <= day && day <= 12) { 
    System.out.println(out[(day - 1)/3]); 
} else { 
    System.out.println("Error!"); 
} 
+2

Zgadzam się, robiąc to jest znacznie czystsze niż użycie bloków "if" lub "switch". – fireshadow52

+4

Mamy 12 miesięcy na umieszczenie w 4 koszach, więc powinniśmy podzielić przez 3. –

+7

Popieram tę odpowiedź, jednak aby ją poprawić: System.out.println ((dzień> 0 && dzień <13)? day-1)/3]: "Błąd!"); – emory

3

Który byś woleć? To jest twój kod.

Zdecydowanie wolę skrzynkę przełączników, ale jeśli coś jest połączone lub np. "większy niż" przełącznik nie jest właściwym sposobem.

Kolejna rzecz: chciałbym napisać sprawę przełącznik jak poniżej, ponieważ myślę, że lepiej jest przeczytać:

switch(day){ 
    case 1: 
    case 2: 
    case 3: 
     System.out.println("1st Quarter"); 
     break; 
...   
} 

HTH, Andreas

2

Co o:

(day>=1 && day <=3) ? System.out.println("1st Quarter") : 
    (day >= 4 && day <= 6) ? System.out.println("2nd Quarter") : 
    (day >=7 && day <= 9) ? System.out.println("3rd Quarter") : 
     (day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1"); 

;)

Można również wykonać następujące czynności:

String val = (day>=1 && day <=3) ? "1st Quarter" : 
     (day >= 4 && day <= 6) ? "2nd Quarter" : 
     (day >=7 && day <= 9) ? "3rd Quarter" : 
      (day >= 10 && day <= 12) ? "4th Quarter" : "Error1"; 
System.out.println(val); 

Myślę, że albo powinno działać.

+0

jak zastąpić to moim bieżącym kodem? – Zhianc

+0

Każdy z powyższych powinien zadziałać. Operatory potrójne mogą albo ustawiać wartości, albo oceniać. –

+1

To jest po prostu sprytne. – cwallenpoole

3
  • Unikaj konieczności logiki do rozgałęzienia w pierwszej kolejności. Wyszukiwanie tabeli jest często przydatną techniką. Ważna jest również manipulacja arytmetyczna - szukaj wzoru w wartościach, które Cię interesują, oraz funkcji, która przekształca je w coś prostszego. Weź również pod uwagę polimorfizm w bardziej złożonych przypadkach.

  • Jeśli obsługujesz wszystkie wyjątki w ten sam sposób, zrób to w tym samym miejscu.

  • Zakres zmiennych ściśle, jeśli to możliwe.

  • Pytaj o wejście, które naprawdę chcesz, FFS. :)

import java.io.*;

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

(-1 - 1)/3 == 0 – Robert

2

To nie jest dla mnie jasne, czy pytanie dotyczy rozwiązań dla konkretnego przykładu kodu, lub o strukturze w ogóle. Tak więc, niektóre zalety podejścia if-else są rozważane.

  • if-else jest bardziej powszechne w kodzie ogólnej, ponieważ liczba typów danych akceptowane przez przełącznik jest ograniczona, a sam przełącznik jest ograniczona skompilować wartości czasu. Więcej znajomości jest lepsze dla czytelności dla szerszej publiczności.

  • Podstawowa struktura nie ulega zmianie, jeśli zmienisz wymagania dotyczące i musisz obsługiwać inny typ danych. Musiałem zmienić wiele przełączników w tabelach, aby porównywać ciągi znaków w mój czas, kiedy ktoś dodał wymóg, aby użytkownicy mogli skonfigurować opcje na .

  • Potrzeba użycia przerwy; Właściwie wewnątrz przełączników wprowadzono możliwości występowania nieparzystych błędów, które pojawiają się tylko w przypadku narożników, ponieważ przełączniki stają się duże i skomplikowane.

Oczywiście osobiście będąc programistą przedsiębiorstwo bym stworzył timeUnitSubDivisionResolvingVisitor ... :)

1

prostu alternatywny sposób realizacji jest przez mapę. To sprawi, że będzie on konfigurowalny, zwłaszcza jeśli używasz Springa, gdzie możesz ustawić tę zmienną Map w pliku bean.xml, jeśli zdecydujesz.

Zresztą tutaj jest alternatywa:

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)); 
2
String[] suffix = new String[]{ "st", "nd", "rd", "th" }; 
System.out.println((1 <= day && day <= 12)? 
    String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]): 
    "Error!" 
); 
Powiązane problemy