Если вы хотите, чтобы какой-то код выполнялся на основе двух или более условий, как лучше всего отформатировать этот оператор if?
первый пример: -
if(ConditionOne && ConditionTwo && ConditionThree)
{
Code to execute
}
Второй пример: -
if(ConditionOne)
{
if(ConditionTwo )
{
if(ConditionThree)
{
Code to execute
}
}
}
что легче всего понять и прочитать, имея в виду, что каждое условие может быть длинным именем функции или чем-то еще.
if-statement
formatting
language-agnostic
Гай Кодер
источник
источник
Ответы:
Я предпочитаю вариант А
Если у вас есть особенно длинные переменные / условия метода, вы можете просто разорвать их на строку
Если они еще более сложные, то я бы подумал о том, чтобы делать методы условия отдельно вне оператора if.
IMHO Единственная причина для варианта «B» - это если у вас есть отдельные
else
функции для запуска для каждого условия.например
источник
Другие ответы объясняют, почему обычно лучше всего первый вариант. Но если у вас несколько условий, подумайте о создании отдельной функции (или свойства), выполняющей проверку условий в варианте 1. Это значительно упрощает чтение кода, по крайней мере, при использовании хороших имен методов.
Если условия зависят только от переменных локальной области видимости, вы можете сделать новую функцию статической и передать все, что вам нужно. Если есть микс, передайте местный материал.
источник
isOkToDoWhatever
в качестве свойства имеет большой смысл.if
удобочитаемости операторов, но и в удобочитаемости условий.Первый пример более «читаемый».
На самом деле, на мой взгляд, вы должны использовать только второй вариант, когда вам нужно добавить некоторую «логику else», но для простого Conditional используйте первый вариант. Если вас беспокоит длина условия, вы всегда можете использовать следующий синтаксис:
Удачи!
источник
Вопрос был задан и до сих пор получен ответ, как будто решение должно приниматься исключительно на «синтаксических» основаниях.
Я бы сказал, что правильный ответ о том, как вы выкладываете ряд условий в if, также должен зависеть от «семантики». Итак, условия должны быть разбиты и сгруппированы в соответствии с тем, что «концептуально» сочетается друг с другом.
Если два теста действительно являются двумя сторонами одной медали, например. если (x> 0) && (x <= 100), то поместите их в одну строку. Если другое условие концептуально гораздо более отдаленное, например. user.hasPermission (Admin ()), затем поместите его в отдельную строку
Например.
источник
if ( ( single conditional expression A ) && ( single conditional expression B ) && ( single conditional expression C ) ) { opAllABC(); } else { opNoneABC(); }
Форматирование нескольких условных выражений в выражении if-else следующим образом:
a. все двоичные логические операции {&&, ||} в выражении, показанном первым
b. оба условных операнда каждой бинарной операции очевидны, потому что они выровнены по вертикали
c. Операции вложенных логических выражений становятся очевидными с помощью отступов, как и вложения операторов внутри предложения
a. это позволяет избежать распространенных ошибок статического анализа
. отключить отдельные одиночные условные тесты с помощью только a //
b. установить точку
останова непосредственно перед или после любого отдельного теста ceg ...
// disable any single conditional test with just a pre-pended '//' // set a break point before any individual test // syntax '(1 &&' and '(0 ||' usually never creates any real code if ( 1 && ( single conditional expression A ) && ( single conditional expression B ) && ( 0 || ( single conditional expression C ) || ( single conditional expression D ) ) ) { ... ; } else { ... ; }
источник
Второй - классический пример антипаттерна стрелки, поэтому я бы его избегал ...
Если ваши условия слишком длинные, извлеките их в методы / свойства.
источник
Первый вариант проще, потому что, если вы читаете его слева направо, вы получите: «Если что-то И что-то еще И что-то еще ТО», что легко понять. Второй пример гласит: «Если что-то ТО, если что-то еще ТО, если что-то еще ТО», что неуклюже.
Также подумайте, хотите ли вы использовать несколько OR в своем предложении - как бы вы это сделали во втором стиле?
источник
В Perl вы могли сделать это:
Если какое-либо из условий не выполняется, он просто продолжится после блока. Если вы определяете какие-либо переменные, которые хотите сохранить после блока, вам нужно будет определить их до блока.
источник
Я столкнулся с этой дилеммой долгое время и до сих пор не могу найти правильного решения. На мой взгляд, единственный хороший способ - сначала попытаться избавиться от состояний, чтобы не сравнивать сразу 5 из них.
Если альтернативы нет, то, как предлагали другие, - разбейте ее на отдельные и сократите имена или сгруппируйте их, и, например, если все должно быть истинным, используйте что-то вроде «если нет ложного в массиве x, тогда запускайте».
Если ничего не получится, @Eoin Campbell высказал довольно хорошие идеи.
источник
Когда условие действительно сложное, я использую следующий стиль (пример из реальной жизни PHP):
Я считаю, что это лучше и удобнее, чем вложение нескольких уровней
if()
. И в некоторых случаях, подобных этому, вы просто не можете разбить сложное условие на части, потому что в противном случае вам пришлось быif() {...}
многократно повторять одни и те же операторы в блоке.Я также считаю, что добавление «воздуха» в код - всегда хорошая идея. Это значительно улучшает читаемость.
источник