Лучше: switch-case или if-else?

Возможный дубликат:
If/Else vs. Switch

У меня есть два кода здесь, я просто хотел спросить, какая из них лучше с точки зрения возможности записи (простота написания кодов) и с точки зрения удобочитаемости (простота понимания кодов).

включение случай:

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

    }
}

если-то еще:

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

Я тоже не сделаю этого:

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

Какой из них вы бы предпочли? Это ваш код.

Я определенно предпочитаю коммутатор, но если у вас есть что-то комбинированное или, например, "больше, чем" коммутатор "- это неправильный способ сделать это.

Другое дело: я бы написал случай с переключателем, как показано ниже, потому что я думаю, что лучше читать:

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

HTH, Андреас

Ответ 3

  • Избегайте необходимости в ветки логики в первую очередь. Поиск таблицы часто является полезным методом. Арифметическая манипуляция также важна - найдите шаблон в значениях, которые вам нужны, и функцию, которая превращает их в нечто более простое. Также рассмотрите полиморфизм в более сложных случаях.

  • Если вы обрабатываете все исключения одинаково, то делайте это в одном и том же месте.

  • Скопируйте переменные по мере возможности.

  • Запрос на ввод, который вы действительно хотите, 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!");
        }
    }
}

Ответ 4

Как насчет:

(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");

;)

Вы также можете сделать это:

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);

Я думаю, что оба должны работать.

Ответ 5

Мне непонятно, возникает ли вопрос о решениях конкретного примера кода или о структуре вообще. Итак, некоторые достоинства подхода if-else для рассмотрения.

  • if-else чаще всего используется в коде, так как число типы данных, принятые коммутатором, ограничены, а сам переключатель ограничен для компиляции значений времени. Более знакомы лучше для удобочитаемости для более широкой аудитории.

  • Фундаментальная структура не меняется, если вы найдете изменения требований, и вам необходимо поддерживать другой тип данных. Мне пришлось изменить множество переключателей на перечислениях для сравнения строк в мое время, когда кто-то добавил требование, чтобы пользователи могли настройте параметры.

  • Необходимость использования break; правильно внутри коммутаторов вводит возможности для нечетных ошибок, которые появляются только в переключатели становятся большими и сложными.

Конечно, лично являясь программистом на предприятии, я бы создал timeUnitSubDivisionResolvingVisitor...:)

Ответ 6

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

Ответ 7

просто альтернативный способ его реализации через карту. Это сделает его настраиваемым, особенно если вы используете Spring, где вы можете настроить эту конфигурацию карты в своем bean.xml, если вы решите.

В любом случае вот альтернатива:

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));