Из чего некоторые инструкции для лучшего использования if
по сравнению с unless
в коде Perl? Там веские причины состоят в том, чтобы предпочесть один или другой в некоторых ситуациях?
Практическое правило гласит, что «если», вероятно, следует использовать нечасто.
Это особенно полезно в постфиксной форме, например:
delete_old_widgets() unless $old_widget_count == 0
Ситуации, в которых вы никогда не должны использовать except:
В Perl Best Practices есть совет никогда не использовать unless
. Лично я считаю это безумием.
Я использую unless
всегда, когда есть простое условие, которое в противном случае я бы написал как if( ! ... )
. Я считаю версию unless
более читабельной, особенно когда она используется в качестве постфикса:
do_something() unless $should_not_do_that;
Я рекомендую избегать unless
, когда ситуация усложняется, например, когда у вас есть блоки elsif
или else
. (К счастью, или, возможно, к сожалению, в зависимости от вашей точки зрения, не существует elsunless
)
Также в любом случае, когда условие является сложным выражением, состоящим из других булевых выражений. Например,
unless( $foo and !$bar )
чертовски запутанно, и не имеет никаких преимуществ перед эквивалентным if
.
За исключением одного эзотерического случая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;
return
. Хотя я понимаю мотивы подобных вопросов, я не считаю, что использование чего-то вроде unless
действительно разумно сводить к конкретным правилам. Это, как и многое другое из вспомогательного синтаксиса в Perl, предоставляется как небольшое удобство для программистов, чтобы помочь им более четко формулировать свои мысли по собственному усмотрению; я видел, что ведущие разработчики в "Программировании Perl" говорили об этом не один раз. Здесь нет никакой высшей цели или рационализации. Я прекрасно понимаю, что это утончает вопрос, но единственное ограничение, которое я бы наложил на его использование - это убедиться, что он служит своей более широкой цели - сделать код более понятным. Если это так, то все в порядке. Распознавание того, понятен ли код, само по себе интуитивно и не может быть сведено к большой горстке слишком обобщенных условий использования, касающихся каждого нюанса встроенных модификаторов/операторов/общего синтаксиса, и там, где ограничения и рекомендации необходимы в больших групповых проектах, я не думаю, что имеет смысл так тонко разделять волосы.
Возможно, это личное мнение, но я предпочитаю использовать Если только условие if не начинается с!