альтернатива, к если оператор в Java

С надлежащими настроенными индексами Ваши соединения могут работать очень быстро. Используйте SQL Profiler для определения, какие индексы должны быть созданы или изменены для оптимизации производительности общих запросов. Обязательно настройте план технического обслуживания, чтобы Ваша база данных работала один раз в неделю (или каждый день для таблиц, которые изменяются много), который обновляет Вашу статистику и индексы.

Нормализация обычно предпочитается по хранению данных в нескольких местоположениях. Существуют сценарии, где вставляют/обновляют, не должен происходить быстро, и выбор должен произойти очень быстро, в этом случае, Вы могли быть более обеспечены без нормализации. Несмотря на это, преждевременной оптимизации не рекомендуют, так пойдите с нормализованной структурой сначала.

6
задан Hellnar 25 October 2009 в 17:18
поделиться

8 ответов

Один «истинно объектно-ориентированный» ответ - определить интерфейс для «Правила» (с помощью методов condition () и action ()), создать 3 реализации, поместить их в коллекцию и затем просто перебирайте их в общем виде, как в:

List<Rule> rules = .... ; // your 3 rules initialized here somehow
for(Rule r : rules) {
  if(r.condition()) {
    r.action();
  }
}

Это имеет больше смысла, если у вас 300 правил / условий, а не только 3.

В Java8 вы можете захотеть сделать это вместо этого, если правила CPU- интенсивный:

rules.parallelStream().filter(Rule::condition).forEach(Rule::action);
27
ответ дан 8 December 2019 в 02:09
поделиться

Короткий ответ - да.

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

  1. Полиморфизм, когда поведение зависит от начальных значений.
  2. Присваивание по ссылке, когда известны возможные начальные значения, и они имеют корреляцию 1 к 1 с возвращаемыми значениями. Для этого списки лучше массивов, но ...

     // Пример:
    если (а == 1) {б = 2; }
    если (а == 2) {б = 17; }
    
    // Становится 
    int fx (2); // наш массив ответов
    fx [0] = 2; 
    fx [1] = 17; 
    b = fx [a - 1];
    
  3. Референсное ветвление, когда известны возможные начальные значения, и они имеют корреляцию 1 к 1 с используемой функцией / ветвью. (пример не Java)

     // Пример:
    если (== 1) {doSomething1 (); }
    если (== 2) {doSomething2 (); }
    
    // Становится
    функция * fx (2); // наш массив или еще лучше список функций
    fx [0] = & doSomething1; 
    fx [1] = & doSomething2; 
    `fx [a - 1] (); `
    
  4. Прямое логическое присвоение.

    Мы ненавидим:

     if (thisCondition == true) {
     b = верно; 
    } else { 
     b = ложь; 
    }
    

    Должно быть:

    b = thisCondition;

8
ответ дан 8 December 2019 в 02:09
поделиться

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

EDIT

вы можете попробовать применить метод извлечения несколько раз:

doAIfX();
doBIfY();
doCifZ();

где методы определены как:

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}
3
ответ дан 8 December 2019 в 02:09
поделиться

Использовать полиморфизм.

interface SomethingDoer {
    public void doSomething();
}

class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }

public class Main {
     public static void main (String[] args) {
          SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
          doer.doSomething();
     }
}

Условие if не устранено полностью, но перемещено в SomethingDoerFactory. Это решение применимо не во всех случаях, но в некоторых из них это очень хорошая альтернатива множественным if.

Вот хороший разговор об этом:
http: //misko.hevery. com / 2008/12/08 / clean-code-переговорщики-наследование-полиморфизм-тестирование /

3
ответ дан 8 December 2019 в 02:09
поделиться

это действительно зависит от того, что такое x, y, z и a, b, c. Иногда более подходящими являются утверждения if. Иногда полиморфизм более подходит.

0
ответ дан 8 December 2019 в 02:09
поделиться

Звучит как идеальный случай для использования закрытия . Но для этого вам понадобится groovy или что-то подобное.

0
ответ дан 8 December 2019 в 02:09
поделиться

Вам понадобятся эти операторы if.

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

0
ответ дан 8 December 2019 в 02:09
поделиться

Альтернативами if-else в Java являются оператор switch и условный тернарный оператор (?: ), ни один из них не делает в точности то, что вы просите (обработайте только if без else ). На мой взгляд, опубликованный вами код - лучший способ сделать это.

5
ответ дан 8 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: