Каковы некоторые рекомендации по наилучшему использованию if
по сравнению с unless
в коде Perl? Есть ли веские причины предпочесть тот или иной в некоторых ситуациях?
В Perl Best Practices совет никогда не использовать, unless
. Лично я считаю это безумием.
Я использую, unless
всегда есть простое условие, которое я в противном случае написал if( !... )
как if( !... )
. Я считаю, unless
версия будет более удобной для чтения, особенно при использовании в качестве постфикса:
do_something() unless $should_not_do_that;
Я рекомендую избегать, unless
любое время вещи не станут более сложными, например, когда у вас будут elsif
или else
блоки. (К счастью или, возможно, к сожалению, в зависимости от вашей точки зрения, не существует elsunless
)
Кроме того, любое условие является сложным выражением, состоящим из других логических выражений. Например,
unless( $foo and !$bar )
Это чертовски запутанно, и не имеет никакого преимущества перед аналогом if
.
Помимо одного эзотерического случая 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;
return
.Правило большого пальца состоит в том, что "если", вероятно, следует использовать нечасто.
Это особенно полезно в постфиксной форме, например:
delete_old_widgets() unless $old_widget_count == 0
Ситуации, в которых вы никогда не должны использовать, если:
Недавно я потратил час, пытаясь объяснить кому-то, как работают два вложенных предложения "если" , было трудно дешифровать без необходимости их инвертировать в операторы 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();
}
"Если ты не спокоен, или ты женишься, я накажу тебя".
проблема с использованием "если" даже для простейших случаев, они часто (самостоятельно или через
Я надеюсь, что это ясно, когда вы должны или не должны использовать, если?
(если у вас нет другого мнения?)
Хотя я понимаю мотивы для таких вопросов, я не считаю, что разумно свести к употреблению что-то вроде unless
в конкретные эмпирические правила. Это, как и много вспомогательного синтаксиса в Perl, предоставляется в качестве незначительного удобства для программистов, чтобы помочь им четко сформулировать себя по своему усмотрению; Я видел, как многие говорили по-разному, чем ведущие разработчики на протяжении всего "программирования Perl". Нет высшей цели или рационализации. Я хорошо знаю этот вопрос, но единственное ограничение, которое я бы наложил на его использование, - это увидеть его более широкую задачу сделать код более понятным. Если да, то все хорошо. Признание того, понятен ли код, сам по себе интуитивно понятен и не может быть сведен к большому количеству чрезмерно обобщенных условий использования в отношении каждого нюанса встроенных модификаторов/операторов/общего синтаксиса и где требуются ограничения и рекомендации в проектах больших групп Я не думаю, что было бы разумно разделить волосы на это.
Apropos...
В Perl Best Practices совет никогда не использовать, если. Лично я считаю это безумием.
После 20+ лет, отдавая предпочтение Perl любой из его альтернатив (большинство из которых не существовало бы, если бы Perl не предоставил шаблон), я не только согласен с вердиктом "безумие", я удивлен (обеспокоен) услышать, что "Best" Практика хочет избавиться от этого.
Тем не менее, я настоятельно предпочитаю код, написанный для ясности, в отличие от неявно запутанных альтернатив, которые некоторые программисты Perl принимают "просто потому, что могут". "исключение" является однозначной противоположностью "если", и, следовательно, очень полезная альтернатива встраиванию отрицания в условное "если", особенно если условное содержит несколько операторов. И это обоснование применимо, даже если за ним следует else/elsif.
/msx
. Дамиан, как правило, лучше этого, и я думаю, что он, возможно, передумал по поводу некоторого содержания.
Мое мнение было бы никогда не использовать, если только. Мои причины таковы:
В perl есть действительно 4 способа написать оператор if, если, если и не поставит проверку в конце строки вместо начала. Я предпочитаю один последовательный метод, который также согласуется с другими langauges.
Только мои $0,02.
do_use($feature) unless (!grep($_->name ne "perl" && $_->has_feature($feature), @languages));
После этого к его логическому завершению нам бы все написали ассемблер или фортран. :-) Думаю, даже если бы я никогда не видел Perl раньше, я бы мог правильно угадать, что, unless
иметь в виду
Синтаксис 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(). Чем меньше вы должны помнить и балансировать в своей памяти, тем быстрее вы будете отлаживать свой собственный код.
Просто личное мнение может быть, но мне нравится использовать, если условие if начнется с!
unless
необходимости автоматически избегать сложных выражений.if (!($foo and !$bar))
не обязательно понятнее, и программист не должен (и может не хотеть) применять теорему ДеМоргана, чтобы получить более чистыеif (!$foo or $bar)
.