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

47

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

Теги:
if-statement
readability

9 ответов

57

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

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

do_something() unless $should_not_do_that;

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

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

unless( $foo and !$bar )

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

  • 5
    Я не думаю, unless необходимости автоматически избегать сложных выражений. if (!($foo and !$bar)) не обязательно понятнее, и программист не должен (и может не хотеть) применять теорему ДеМоргана, чтобы получить более чистые if (!$foo or $bar) .
  • 2
    +1 за упоминание Perl Best Practices и elsunless.
Показать ещё 2 комментария
36

Помимо одного эзотерического случая 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.
  • 2
    +1 Отличное замечание о неявных доходах.
  • 2
    Иногда я считаю, что отрицание читается более четко, если используется ключевое слово «not», а не «!», Например, get_ready (), если не $ ready;
Показать ещё 4 комментария
12

Правило большого пальца состоит в том, что "если", вероятно, следует использовать нечасто.

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

delete_old_widgets() unless $old_widget_count == 0

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

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

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

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

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

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

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

2

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

1

Apropos...

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

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

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

  • 0
    Помните, что Perl Best Practices также говорит, что каждый шаблон регулярного выражения должен использовать модификаторы /msx . Дамиан, как правило, лучше этого, и я думаю, что он, возможно, передумал по поводу некоторого содержания.
1

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

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

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

Только мои $0,02.

  • 2
    Итак, вы говорите, что do_use($feature) unless (!grep($_->name ne "perl" && $_->has_feature($feature), @languages)); После этого к его логическому завершению нам бы все написали ассемблер или фортран. :-) Думаю, даже если бы я никогда не видел Perl раньше, я бы мог правильно угадать, что, unless иметь в виду
  • 0
    Привет, Денис, я не очень-то согласен с аргументом, что логический вывод заключается в том, что в итоге мы будем использовать ассемблер. Я пишу Perl-код, как если бы это был любой другой язык. Я даже больше не пишу "или умру". Я всегда буду писать "if (! DoSomething ()) {die;}. Это делает для ОЧЕНЬ читаемого кода то, чего не хватает в большом количестве perl-кода. Если вы программист по обслуживанию и заходите после меня, вы получаете много очень ясного кода, который не использует трюки и имеет много четко определенных функций. Вы читали код, который вы написали выше, у него есть тройной отрицательный по имени eq perl, или это ne? Трудно сказать.
Показать ещё 1 комментарий
0

Синтаксис 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(). Чем меньше вы должны помнить и балансировать в своей памяти, тем быстрее вы будете отлаживать свой собственный код.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню