Подтвердить что ты не робот

Недостатки использования множества утверждений if

Помимо чтения кода, почему плохо использовать множество операторов if?

4b9b3361

Ответ 1

Если у вас много операторов if один за другим, то оператор case switch более полезен. По крайней мере, он имеет фиксированное время отклика для каждого возможного inupt, так как ему не нужно проходить все инструкции if.

В большинстве случаев оператор if (и else) указывает

a) Нарушение принципа единой ответственности

b) Необходимо реорганизовать в шаблон разработки стратегии

Ответ 2

Каждый раз, когда /else вы пишете, увеличивается количество путей кода, которые вы должны проверить.

Ответ 3

Ну, вопрос, который я должен задать, - это "в отличие от чего"?

Если вы имеете в виду, в отличие от оператора switch, то, как и читаемость, он может иногда быть более эффективным. Как правило (определенно в С#, вероятно, в других) ниже определенного количества ветвей, он будет просто превращен в ряд операторов if при компиляции, но помимо этого числа он будет превращен в хэш-поиск и скачок, который вероятно, будет быстрее в среднем случае.

В качестве альтернативы, если вы хорошо знаете относительную частоту разных случаев, вы можете быть более эффективными с помощью набора утверждений if. Например. если 95% случаев совпадают с первой ветвью, 4% соответствуют второй и 1% соответствуют всем остальным, это может дать лучшую производительность для 95% случаев, выполнив одно сравнение и, возможно, даже не разветвление в этом случае.

Итак. Возможно, в этом случае будет коэффициент полезного действия.

Тем не менее, читаемость считается чертовски много. В качестве крайнего примера есть язык Turing, который был разработан только для того, чтобы понять, насколько мал компилятор для языка Turing. Этот дизайнер назвал язык "brainf ** k". Это само по себе является замечательным комментарием о важности читаемого кода в реальном программировании.

Теперь, большая проблема с большим количеством операторов if, заключается в том, что он часто указывает, что вы что-то моделируете с помощью тех операторов if, которые могут быть смоделированы лучше с иерархией классов. В некотором роде это просто еще один подход к чтению (при условии, что программа работает в любом случае). Однако это касается читаемости и понятности программы в целом. Это будет в значительной степени влиять на ментальную модель, которую вы имеете в программе, расширяемость и влияет не только на то, насколько хорошо вы можете ее поддерживать, но и задумаетесь о ней как можно скорее. Это может быть просто разница между программой, которая становится унаследованным временем, пока кто-то не выяснит, как избавиться от нее, и тот, который растет, чтобы продолжать отдавать инвестиции.

Ответ 4

Иногда из-за архитектуры процессора более эффективно искать способ избежать ветвления вообще; это можно считать недостатком операторов if.

Ответ 5

Чуссад прав. Структура коммутатора лучше, чем несколько if-else. Следующим подходом является использование перечисления в качестве ключа коммутатора. В этом случае вы получите предупреждение, если забыли указать один из элементов перечисления в своем коммутаторе.

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

Объявить абстрактный бизнес-метод в вашем перечислении. Внедрите его для каждого элемента перечисления. Вызов enumElement.theMethod() вместо реализации коммутатора.

Вот пример.

enum Foo {
    ONE {
        public void foo() {
           // do something
        }
    }, 

    TWO {
        public void foo() {
           // do something
        }
    }, 

    ;
    public abstract void foo();
}

Вот код, который использует это:

    Foo.valueOf(System.getProperty("foo")).foo();

Сравните эту строку со следующим:

    String foo = System.getProperty("foo");
    if("ONE".equals(foo)) {
        //.....
    } else if("ONE".equals(foo)) {
        //.....
    } else {
        //.....
    }

Я думаю, что комментариев не требуется.

Ответ 6

if(A)
{
}else
if(B)
{
}else
if(C)
{
}else
if(D)
{
}else
{ }

Все if все равно придется "вычислять", делая что-то вроде "O (n)". Его следует избегать, когда это возможно, и используйте switch(Lalala)

Ответ 7

Другая возможность - это зависит от того, что делают операторы if. В некоторых случаях они могут принимать решения, которые лучше выполняются правильно спроектированной иерархией классов.

Можете ли вы опубликовать несколько примеров утверждений, которые вам сказали, являются плохими?

Ответ 8

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

Кроме того, я вижу, что многие люди говорят о case case. Проверьте этот поток SO.

И для конца wiki article о конвейере, который, вероятно, должен прочитать каждый программист.

Надеюсь, что это поможет.

Ответ 9

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

Причина в том, что если логика этого условия изменится, вам нужно будет выслеживать каждый оператор if, который его использует и модифицирует.

Если эта логика инкапсулирована в иерархию классов, ее нужно изменить только один раз.