Это хороший пример трудночитаемого кода.
Давайте сравним несколько разных способов переписать пример кода и посмотрим, как мы сохраним краткость и улучшим читаемость.
Эта троичная версия выигрывает за краткость, но ее все еще трудно читать:
sub _atan {
my( $y, $x ) = @_;
return $x == 0 ? ($y < 0 ? -pip2 : pip2)
: atan( $y / $x );
}
Я считаю, что связанные условные операторы (?:) доступны для чтения только тогда, когда последующие операторы попадают в позицию else:
sub _atan {
my( $y, $x ) = @_;
return $x != 0 ? atan( $y / $x ) :
$y < 0 ? -pip2 : pip2;
}
По-прежнему кратко, но читабельность улучшена.
А как насчет использования if
и unless
? Можем ли мы получить краткий, читаемый код с их использованием?
По своей природе прямой подход if/else будет более подробным:
sub _atan {
my( $y, $x ) = @_;
my $atan;
if( x == 0 ) {
if( $y < 0 ) {
$atan = -pip2;
}
else {
$atan = pip2;
}
}
else {
$atan = atan( $y / $x )
}
return $atan;
}
Легко проследить все вышеперечисленное и посмотреть, каким будет результат. Так что читабельность выигрывает, но краткость страдает.
Я считаю, что использование форм модификатора оператора unless
и if
обеспечивает чистый способ добавить логику короткого замыкания в фрагмент кода:
sub _atan {
my( $y, $x ) = @_;
return atan( $y / $x )
unless $x == 0;
return -pip2 if $y < 0;
return pip2;
}
Это лаконично и читабельно, но мне кажется, что мы получили больше результатов, чем нам нужно.
Итак, если мы введем в смесь условный оператор, мы получим
sub _atan {
my( $y, $x ) = @_;
return atan( $y / $x )
unless $x == 0;
return $y < 0 ? -pip2 : pip2;
}
Эта форма столь же кратка, как и любая из вышеперечисленных форм, но гораздо проще для понимания:
sub _atan {
my( $y, $x ) = @_;
return atan( $y / $x )
unless $x == 0;
return $y < 0 ? -pip2 : pip2;
}
Вложенные операторы if/else могут быть трудны для понимания. Небольшая осторожность при структурировании кода решения может значительно улучшить читабельность и, следовательно, удобство сопровождения, сохраняя при этом краткое выражение лежащей в основе логики.
Запах кода, который нужно было исправить здесь, был причудливой комбинацией условного оператора (?:
) с формой модификатора оператора if
. Изменив порядок тестов и тщательно выбрав способ представления условной логики, мы смогли сохранить краткость и ясность кода.
person
daotoad
schedule
14.09.2009