Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Использование "если" по сравнению с "если" для условных выражений Perl

Автор вопроса: CommunityОтветов: 9

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

if-statementperlreadability

Ответы

Ответ 1 · рейтинг 59 · Community

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

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

do_something() unless $should_not_do_that;

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

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

unless( $foo and !$bar )

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

Ответ 2 · рейтинг 36 · Community

Если не считать одного эзотерического случая1, 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 · рейтинг 12 · Community

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

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

delete_old_widgets() unless $old_widget_count == 0

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

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

Ответ 4 · рейтинг 10 · Community

Недавно я потратил час, пытаясь объяснить кому-то, как работают два вложенных предложения "если", их было трудно расшифровать без необходимости инвертировать их в операторы 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();
}

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

проблема с использованием "если" даже для самых простых случаев, они часто (самостоятельно или вне

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

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

Ответ 5 · рейтинг 2 · Community

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

Ответ 6 · рейтинг 1 · Community

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

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

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

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

Ответ 7 · рейтинг 1 · Community

Кстати...

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

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

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

Ответ 8 · Community

Возможно, это просто личное мнение, но мне нравится использовать Unless, когда условие if начинается с !

Ответ 9 · Community

Синтаксис if(!$condition) эквивалентен If($condition), и то же самое, если вы поменяете НЕ на условие.

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы