これは、読みにくいコードの良い例です。
コードサンプルを書き直すいくつかの異なる方法を比較して、簡潔さを維持し、読みやすさを向上させる方法を見てみましょう。
この三元のみのバージョンは簡潔にするために勝ちますが、それでも読むのは難しいです:
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
。テストの順序を並べ替え、条件付きロジックの表現方法を慎重に選択することで、簡潔さを維持し、コードを明確にすることができました。