Общее программирование — иначе или иначе, если для наглядности

StackOverflow https://stackoverflow.com/questions/1231145

Вопрос

В ситуации, когда переменная может иметь два разных значения, и вы делаете что-то, если это одно, и что-то другое, если это другое, вы бы просто сделали:

if(myVariable == FIRST_POSSIBLE_VALUE) { ... }
else { ... }

или вы бы сделали:

if(myVariable == FIRST_POSSIBLE_VALUE) { ... }
else if (myVariable == SECOND_POSSIBLE_VALUE) { ... }

для ясности, в ситуации, когда читатель не обязательно сможет сказать, что он делает то же самое (но иначе, если это «ненужное» выражение)?Так что бы вы сделали?Спасибо!

РЕДАКТИРОВАТЬ:На самом деле существует гораздо больше различных вариантов чего-то вроде этого:тернарный оператор, if-else, if-elseif, if-elseif-else, -if-else(с утверждением), переключатель.У каждого свое место, но определиться сложно..

Это было полезно?

Решение

Разве для этого не было сделано assert ?

if (condition1) { ... }
else { assert(condition2); }

Это можно расширить и для логики с тремя состояниями.

if (condition1) { ... }
elsif (condition2) { ... }
else { assert(condition3); }

Использование assert делает ваш код читабельным, простым в обслуживании и понятным. При этом assert и комментарии почти взаимозаменяемы.

Другие советы

Я всегда предпочитаю просто else, когда нет другого возможного состояния переменной (т. е. проверка на ноль и все такое).Я могу добавить комментарий о том, что представляет собой переменная, если она не является первой условной, но это только в тех случаях, когда она похожа на

if(color==red){
....
}else{ //our theme only allows for red and yellow, so the color must be yellow.
....
}

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

Я никогда не делаю что-то вроде

if(file.is_open==1){
....
}else if(file.is_open==0){
....

}

поскольку is_open является логическим значением, бессмысленно указывать это, поскольку единственный оставшийся параметр равен 0, также это может сэкономить немного времени на вводе текста, когда вам придется реорганизовать свой код, чтобы вместо этого использовать is_open(), поскольку теперь вам нужно изменить только одну строку вместо двух.

и операторы «else if», я думаю, должны быть превращены в переключатели, если существует более 1 «else if», если, конечно, язык не делает это невозможным (например, как C не может обрабатывать строки в переключателях)

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

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

Я использую if-else только для логических проверок, это означает, что если выражение не совпадает, может быть только else. Или я хочу взять все с остальным: думать об этом как по умолчанию.

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

В Java невозможно использовать переключатель для строк. Таким образом, вы можете использовать что-то вроде этого:

if(string.equals("foo")) {
    // first case
} else if(string.equals("bar")) {
    // second case
} else {
    throw IllegalArgumentException(" ... ");
    // or log it
}

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

Иногда условие оператора else очень очевидно. Например,

if(user.IsNew) { } else { /*in this case user.IsNew != true*/ }

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

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

if(user.SelectedStyle == Styles.Red) {
} else if(user.SelectedStyle == Styles.Basic) {
} else {
 throw new Exception("Not implemented");
}

В приведенном выше случае новый стиль (например, Style.Blue) заставит ваше приложение выдать исключение.

Это действительно вопрос стиля и вашего собственного взгляда на мир. Бокал ОБОИ наполовину пуст и наполовину полон, но вы можете получить самые смелые аргументы об этом.

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

Если нет, я бы рекомендовал пропустить дополнительный тест, но добавить комментарий о практическом значении провала в это последнее утверждение. См. Комментарий Гертьяна выше.

Когда ваши входные данные могут быть четко разделены на отдельные случаи, я чувствую, что в основном лучше явно указать, каковы эти случаи, например, если вы ожидаете, что 'n' будет числом от 0 до 100, и у вас есть 3 случаи:

if (n >= 0 && n < 30) {
   case1();
} else if (n >=30 && n < 70) {
   case2();
} else if (n >=70 && n < 100) {
   case3();
}

в некоторых случаях случай 'else' подходит для проверки ошибок

} else {
   error("n should be between 0 and 100");
}

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

} else { // (n >= 70 && n < 100)
   case3();
}

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

... конечно, это искусство, а не наука, и в некоторых случаях вы не можете следовать строгому правилу, я часто пишу такой код:

if (p == NULL) {
   doSomething();
} else {
   doSomethingElse();
}

... оправдано тем, что это очень очевидно и неявно с первого условия if, для чего используется другое.

else был изобретен и используется по уважительной причине. Где вы используете это, должно быть продиктовано логикой, которую вы пытаетесь достичь, а не надуманным чувством стиля.

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

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

Это зависит от ситуации. Вы хотите предпринять действия только при соблюдении определенных критериев или существует особый случай для одного значения и другой набор логики для любого другого значения?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top