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

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

49
задан 3 revs, 2 users 100% 15 June 2010 в 10:40
поделиться

5 ответов

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

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

delete_old_widgets() unless $old_widget_count == 0

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

  • с составным условием (и / или not)
  • с предложением else
12
ответ дан 7 November 2019 в 11:29
поделиться

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

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

do_something() unless $should_not_do_that;

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

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

unless( $foo and !$bar )

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

60
ответ дан 7 November 2019 в 11:29
поделиться

За исключением одного эзотерического случая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) Последнее вычисленное выражение отличается, что может повлиять на поведение subs без явного return.
35
ответ дан 7 November 2019 в 11:29
поделиться

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

2
ответ дан 7 November 2019 в 11:29
поделиться

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

0
ответ дан 7 November 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: