Каковы некоторые рекомендации по наилучшему использованию if
по сравнению с unless
в коде Perl? Есть ли веские причины предпочесть тот или иной в некоторых ситуациях?
Использование "if versus", если только для условий Perl
Ответ 1
В Perl Best Practices совет никогда не использовать, unless
. Лично я считаю это безумием.
Я использую, unless
всегда есть простое условие, которое я в противном случае написал if( !... )
как if( !... )
. Я считаю, unless
версия будет более удобной для чтения, особенно при использовании в качестве постфикса:
do_something() unless $should_not_do_that;
Я рекомендую избегать, unless
любое время вещи не станут более сложными, например, когда у вас будут elsif
или else
блоки. (К счастью или, возможно, к сожалению, в зависимости от вашей точки зрения, не существует elsunless
)
Кроме того, любое условие является сложным выражением, состоящим из других логических выражений. Например,
unless( $foo and !$bar )
Это чертовски запутанно, и не имеет никакого преимущества перед аналогом if
.
Ответ 2
Помимо одного эзотерического случая 1,unless
только unless
является синтаксическим сахаром для if !
, Он существует, чтобы позволить вам писать код, который будет более понятным и выразительным. Его следует использовать, когда он достигает этой цели, и избегать, когда это ухудшает ее.
Я нахожу unless
что наиболее полезным для управления потоком в циклах. например
while (<$fh>) {
next unless /\S/;
# ...
}
Для простых отрицаний я нахожу это более ясным, чем отрицанный, if
- это легко пропустить это лидерство !
при чтении кода.
unless ($condition) {
do_something();
}
if (!$condition) {
do_something();
}
Но не пиши, unless... else
, потому что это просто раздражает.
В постфиксной форме он дает подсказку о том, каков ожидаемый путь через код.
do_normal_thing() unless $some_unlikely_condition;
1) Последнее вычисленное выражение отличается, что может повлиять на поведение подпрограмм без явного
return
. Ответ 3
Правило большого пальца состоит в том, что "если", вероятно, следует использовать нечасто.
Это особенно полезно в постфиксной форме, например:
delete_old_widgets() unless $old_widget_count == 0
Ситуации, в которых вы никогда не должны использовать, если:
- с составным условием (и, или, не)
- с предложением else
Ответ 4
Недавно я потратил час, пытаясь объяснить кому-то, как работают два вложенных предложения "если" , было трудно дешифровать без необходимости их инвертировать в операторы if с логической логикой.
Если вы попытаетесь преобразовать его на английский, это поможет вам.
Простой, если не работает нормально. Например.
"Если вы не будете спокойны, я буду игнорировать вас".
unless ($quiet) {
ignore();
}
Хотя я думаю, что это работает одинаково хорошо
"Если ты не спокоен, я проигнорирую тебя"
if (not $quiet) {
ignore();
}
когда он начинает усложняться, когда вы отрицаете.
"Если вы не будете шумно, я проигнорирую вас"
unless ( ! $noisy) {
ignore();
}
Лучше написано как
"Если вы будете шумно, я проигнорирую вас"
if ($noisy) {
ignore();
}
Итак, не используйте "если" , если у вас также есть отрицание.
Также не используйте 'if else else'
unless ($quiet) {
ignore();
}
else {
give_a_sweet();
}
'Если вы не будете спокойны, я проигнорирую вас, иначе я дам вам сладкое
Измените его, инвертируя условие.
if ($quiet) {
give_a_sweet();
}
else {
ignore();
}
"Если вы спокойны, я дам вам сладкое, иначе я проигнорирую вас".
с более чем одним условием, он становится беспорядочным.
unless ($quiet and not $fidgit) {
punish();
}
"Если вы не будете спокойны, и вы не преуспеете, я накажу вас".
(извините, мое понимание здесь не сработало!)
отмените его.
if (not $quiet or $fidgit) {
punish();
}
"Если ты не спокоен, или ты женишься, я накажу тебя".
проблема с использованием "если" даже для простейших случаев, они часто (самостоятельно или через
Я надеюсь, что это ясно, когда вы должны или не должны использовать, если?
(если у вас нет другого мнения?)
Ответ 5
Хотя я понимаю мотивы для таких вопросов, я не считаю, что разумно свести к употреблению что-то вроде unless
в конкретные эмпирические правила. Это, как и много вспомогательного синтаксиса в Perl, предоставляется в качестве незначительного удобства для программистов, чтобы помочь им четко сформулировать себя по своему усмотрению; Я видел, как многие говорили по-разному, чем ведущие разработчики на протяжении всего "программирования Perl". Нет высшей цели или рационализации. Я хорошо знаю этот вопрос, но единственное ограничение, которое я бы наложил на его использование, - это увидеть его более широкую задачу сделать код более понятным. Если да, то все хорошо. Признание того, понятен ли код, сам по себе интуитивно понятен и не может быть сведен к большому количеству чрезмерно обобщенных условий использования в отношении каждого нюанса встроенных модификаторов/операторов/общего синтаксиса и где требуются ограничения и рекомендации в проектах больших групп Я не думаю, что было бы разумно разделить волосы на это.
Ответ 6
Мое мнение было бы никогда не использовать, если только. Мои причины таковы:
- Я думаю, что синтаксис делает код более трудным для чтения. Наличие единого метода выполнения if делает вещи проще и более согласованными.
- Если вам нужно добавить инструкцию else позже, вы должны действительно изменить значение if, кроме как if. Это просто проще, если это уже есть if.
- Если логика внутри оператора except становится более сложной, вы можете получить нечетный код, например "if (x == 5 && y!= 7). Это нечетно, потому что на вторая проверка.
- Существуют и другие способы отрицания вещей, т.е. x!= 5
- Это более соответствует другим языкам. Я не знаю какого-либо другого языка, на котором есть утверждение if, и я думаю, что для этого есть очень веская причина.
В perl есть действительно 4 способа написать оператор if, если, если и не поставит проверку в конце строки вместо начала. Я предпочитаю один последовательный метод, который также согласуется с другими langauges.
Только мои $0,02.
Ответ 7
Apropos...
В Perl Best Practices совет никогда не использовать, если. Лично я считаю это безумием.
После 20+ лет, отдавая предпочтение Perl любой из его альтернатив (большинство из которых не существовало бы, если бы Perl не предоставил шаблон), я не только согласен с вердиктом "безумие", я удивлен (обеспокоен) услышать, что "Best" Практика хочет избавиться от этого.
Тем не менее, я настоятельно предпочитаю код, написанный для ясности, в отличие от неявно запутанных альтернатив, которые некоторые программисты Perl принимают "просто потому, что могут". "исключение" является однозначной противоположностью "если", и, следовательно, очень полезная альтернатива встраиванию отрицания в условное "если", особенно если условное содержит несколько операторов. И это обоснование применимо, даже если за ним следует else/elsif.
Ответ 8
Просто личное мнение может быть, но мне нравится использовать, если условие if начнется с!
Ответ 9
Синтаксис if (! $condition) эквивалентен if ($ condition), а также если вы замените NOT'ing условия.
Я лично предпочитаю использовать только утверждения IF. Зачем? Потому что это меньше, чтобы запомнить. Если у вас есть 100 строк кода, половина из которых использует(), а другую половину, используя if(), вам нужно потратить больше времени на отладку, чем если бы это были только инструкции().
Вы можете "получить" зависание, если и если, однако, чтобы между ними не было времени. Но это не только о(), а не о(). Не забывайте, что...
if($condition) {
#passed-condition code
} else {
#failed-condition code
}
... эквивалентно...
unless(!$condition) {
#passed-condition code
} else {
#failed-condition code
}
Но как насчет if() {...} elsif() {...}? Как вы сделаете эквивалент этого, если() {...} elsunless() {...}? Чем сложнее логика, тем труднее становится между if() и if(). Чем меньше вы должны помнить и балансировать в своей памяти, тем быстрее вы будете отлаживать свой собственный код.