Какие методы использовать вместо оператора if-else? - PullRequest
1 голос
/ 24 января 2020

Есть ли способ уменьшить объем кода с большим количеством условий, записанных в java netbean? Я использовал оператор if-else с множеством условий и понял, что мой код довольно длинный. Условия взяты из поля со списком и текстового поля (еще не добавлено).

У меня есть образец кода внизу. Мне нужно добавить 20+, так что я не уверен, является ли оператор if-else единственным вариантом.

    if (RegionBx.getSelectedItem().equals("Tokyo") &&
        SeasonBx.getSelectedItem().equals("Spring") && 
        MealBx.getSelectedItem().equals("Nil")) {
          TravelCost = Tokyo + (Tokyo * sphotel) + (Tokyo * spflight);
    } 

Ответы [ 2 ]

2 голосов
/ 24 января 2020

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

Для выполнения задач такого рода вам просто нужно сопоставить строки с ценами.

Избавьтесь от необходимости использовать условные выражения. Используйте коллекции, чтобы сохранить возможные выходные данные, связанные с возможными входными данными.

 Map<String, Integer> cityPrices = HashMap<String, Integer>();
 Map<String, Integer> seasonPrices = HashMap<String, Integer>();
 Map<String, Integer> mealPrices = HashMap<String, Integer>();

 // Don't forget to initialize your collections. 
 // Put possible string values and their prices in maps.

 cityPrices.put("Tokyo", 10000);
 ...

 Integer regionPrice = cityPrices.get(RegionBx.getSelectedItem()); 
 Integer seasonPrice = regionPrice * seasonPrices.get(SeasonBx.getSelectedItem());
 Integer mealPrice = regionPrice * mealPrices.get(MealBx.getSelectedItem());

 Integer travelCost = regionPrice + seasonPrice + mealPrice; // Now it is one line for all cases.
1 голос
/ 24 января 2020

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

switch (regionBx.getSelectedItem() + ":" +
        seasonBx.getSelectedItem() + ":" +
        mealBx.getSelectedItem()) {
case "Tokyo:Spring:Nul":
    travelCost = tokyo + (tokyo * sphotel) + (tokyo * spflight);
    break;
...
} 

Или:

String[][] criteria = new String[][]{
    {"Tokyo", "Spring", "Nul"},
    ...
};
IntSupplier[] computations = new IntSupplier[] {
    () -> tokyo + (tokyo * sphotel) + (tokyo * spflight),
    ...
};

String region = regionBx.getSelectedItem();
String season = seasonBx.getSelectedItem();
String meal = mealBx.getSelectedItem();
for (int i = 0; i < criteria.length; i++) {
    if (region.equals(criteria[i][0]) &&
        season.equals(criteria[i][1]) &&
        meal.equals(criteria[i][2])) {
        travelCost = computations[i]();
        break;
    }
}

(я не уверен, что синтаксис 2-й версии у меня совершенно правильный. Прокомментируйте или отредактируйте.)

Если вы можете express вычислить как формулу, основанную на ограниченном наборе факторов, которые можно посмотреть на картах, см. @ Steyrix's answer .


Однако это не ясно, что результат будет лучше (более читабельным / более понятным), чем версия с большим количеством if тестов.

И вряд ли они будут более эффективными.

Моя личная рекомендация будет использовать if тесты в первой версии и тратить усилия на «полировку» кода, только если метод расширяется до сотен строк кода.

...