Использование «если» и «если» для условных выражений Perl - PullRequest
49 голосов
/ 16 июня 2010

Каковы некоторые рекомендации для лучшего использования if против unless в Perl-коде?Есть ли веские причины отдавать предпочтение тому или иному в некоторых ситуациях?

Ответы [ 9 ]

59 голосов
/ 16 июня 2010

В Perl Best Practices рекомендуется никогда не использовать unless. Лично я думаю, что это безумие.

Я использую unless всякий раз, когда есть простое условие, которое в противном случае я бы написал как if( ! ... ). Я нахожу версию unless более читабельной, особенно при использовании в качестве постфикса:

do_something() unless $should_not_do_that;

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

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

unless( $foo and !$bar )

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

35 голосов
/ 16 июня 2010

Помимо одного эзотерического случая 1 unless - просто синтаксический сахар для if !. Он существует, чтобы позволить вам писать код, который будет более понятным и выразительным. Его следует использовать, когда он достигает этой цели, и избегать, когда это ухудшает ее.

Я считаю unless наиболее полезным для управления потоком в циклах. например, * +1008 *

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.
12 голосов
/ 16 июня 2010

Практическое правило заключается в том, что «если», вероятно, следует использовать нечасто.

Это особенно полезно в форме постфикса, например:

delete_old_widgets() unless $old_widget_count == 0

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

  • с составным условием (и, или, нет)
  • с предложением else
9 голосов
/ 18 марта 2014

Недавно я потратил час, пытаясь объяснить кому-то, как работают два вложенных предложения «если», расшифровать их было сложно без необходимости инвертировать их в операторы if с логической логикой.

Если вы попытаетесь преобразовать его в английский, это поможет вам.

Простой, если не работает нормально. Например.

«Если вы не молчите, я вас проигнорирую».

unless ($quiet) {
    ignore();
}

Хотя я думаю, что это работает одинаково хорошо

«Если вы не молчите, я вас проигнорирую»

if (not $quiet) {
    ignore();
}

когда все становится сложным, это когда у вас отрицание.

«Если вы не шумите, я буду игнорировать вас»

unless ( ! $noisy) {
    ignore();
}

Гораздо лучше записано как

«Если вы шумите, я вас проигнорирую»

if ($noisy) {
    ignore();
}

Итак, не используйте «если», если у вас также есть отрицание.

Также не используйте «если нет»

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();
}

«Если ты не будешь спокоен, или ты урод, я тебя накажу».

проблема с использованием «если» даже для простейших случаев, они часто (самостоятельно или вне его

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

(разве у вас нет другого мнения?)

2 голосов
/ 17 июня 2010

Хотя я понимаю мотивы такого рода вопросов, я не верю, что действительно разумно сводить использование чего-то вроде unless к конкретным эмпирическим правилам.Это, подобно большому количеству вспомогательного синтаксиса в Perl, предоставляется программистам как небольшое удобство, чтобы помочь им сформулировать себя более четко по своему усмотрению;Я видел то, что было сказано во многих отношениях больше, чем один из ведущих разработчиков в «Программировании на Perl».Там нет высшей цели или рационализации.Я хорошо знаю этот вопрос, но единственное ограничение, которое я бы наложил на его использование, состоит в том, чтобы убедиться, что он служит более широкой цели - сделать код более понятным.Если это так, то все хорошо.Признание того, что код понятен, само по себе интуитивно понятно и не может быть сведено к большому количеству чрезмерно обобщенных условий использования, касающихся каждого нюанса встроенных модификаторов / операторов / общего синтаксиса, а также тех случаев, когда в больших групповых проектах необходимы ограничения и рекомендацииЯ не думаю, что имеет смысл так тонко подстричься.

1 голос
/ 02 июня 2018

По поводу ...

В Perl Best Practices совет никогда не использовать, если только.Лично я думаю, что это безумие.

Спустя 20 с лишним лет, отдавая предпочтение Perl любой из его альтернатив (большинство из которых не существовало бы, если бы Perl не предоставил шаблон), я не только согласен с 'безумием'«Вердикт, я удивлен (обеспокоен) слышать, что« Best Practices »хочет от него избавиться.

Тем не менее, я настоятельно предпочитаю код, написанный для ясности, в отличие от неявно запутанных альтернатив некоторых Perlпрограммисты принимают «только потому, что могут».«исключение» является однозначной противоположностью «если», и, следовательно, очень полезная альтернатива встраиванию отрицания в условное «если», особенно если условное содержит несколько операторов.И это обоснование применяется, даже если за ним следует else / elsif.

1 голос
/ 04 марта 2013

Мое мнение было бы никогда не использовать, если.Мои причины:

  • Я думаю, что синтаксис делает код более трудным для чтения.Наличие единственного метода выполнения оператора if упрощает и делает его более последовательным.
  • Если вам нужно добавить оператор else позже, вам действительно следует заменить if на if.Проще просто, если это уже if.
  • Если логика внутри оператора Тогда становится более сложной, то вы можете получить нечетный код, подобный "exc (x == 5 && y! = 7). Этостранно, потому что на второй проверке есть двойной отрицательный знак.
  • Существуют и другие способы отрицания, например, x! = 5
  • Это больше согласуется с другими языками. Я не знаюлюбого другого языка, в котором есть выражение "исключение", и я думаю, что для этого есть очень веская причина.

В Perl действительно есть 4 способа написать выражение if, if, excal и затем поместитьпроверять в конце строки вместо начала. Я очень предпочитаю один последовательный метод, который согласуется также с другими языками.

Только мои 0,02 доллара.

0 голосов
/ 02 марта 2016

Синтаксис if (! $ Условие) эквивалентен, если ($ условие), и аналогично, если вы меняете условие NOT'ом условия.

Лично я предпочитаю использовать только заявления IF. Зачем? Потому что меньше запоминать. Если у вас есть 100 строк кода, половина из которых используется для функции uns (), а другая половина - для функции if (), вам потребуется больше времени на его отладку, чем если бы это были просто операторы if ().

Вы можете «получить» навык, если и если, тем не менее, так что переход между ними не займет совсем времени. Но дело не только в том, если (), чем в (). Не забывай об этом ...

if($condition) {
    #passed-condition code
} else {
    #failed-condition code
}

... эквивалентно ...

unless(!$condition) {
    #passed-condition code
} else {
    #failed-condition code
}

Но как насчет if () {...} elsif () {...}? Как бы вы сделали эквивалент этого в, если () {...} elsunless () {...}? Чем сложнее логика, тем сложнее становится переходить между if () и exc (). Чем меньше вы должны помнить и балансировать в своей памяти, тем быстрее вы будете отлаживать свой собственный код.

0 голосов
/ 11 августа 2010

Может быть, только личное мнение, но я бы хотел использовать, если только условие if начинается с!

...