To dobry przykład trudnego do odczytania kodu.
Porównajmy kilka różnych sposobów, aby przepisać przykład kodu i zobaczyć, jak postępujemy, zachowując zwięzłość i poprawiając czytelność.
Ten trójargumentowy tylko wersja wygrywa dla zwięzłości, ale wciąż jest to trudne do odczytania:
sub _atan {
my($y, $x) = @_;
return $x == 0 ? ($y < 0 ? -pip2 : pip2)
: atan($y/$x);
}
Uważam, że przykuty operatorów warunkowych (:) są tylko do odczytu, gdy kolejne podmioty wchodzą w położeniu innym:
sub _atan {
my($y, $x) = @_;
return $x != 0 ? atan($y/$x) :
$y < 0 ? -pip2 : pip2;
}
Jeszcze krótszy, ale poprawia się czytelność.
Ale co z używaniem if
i unless
? Czy możemy również użyć zwięzłego, czytelnego kodu?
ze swej natury prosto if/else podejście będzie bardziej gadatliwy:
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;
}
Łatwo jest prześledzić przez wyżej i zobaczyć, co wynik będzie. Czytelność wygrywa, ale maleje zwięzłość.
uważam, że za pomocą formularzy oświadczenie modyfikatora unless
i if
zapewnić czystą sposób dodać logikę zwarciem do fragmentu kodu:
sub _atan {
my($y, $x) = @_;
return atan($y/$x)
unless $x == 0;
return -pip2 if $y < 0;
return pip2;
}
To jest zwarte i przejrzyste, ale wydaje mi się jak mamy więcej zwrotów niż potrzebujemy.
Jeśli więc wprowadzić operatora warunkowego do mieszanki otrzymujemy
sub _atan {
my($y, $x) = @_;
return atan($y/$x)
unless $x == 0;
return $y < 0 ? -pip2 : pip2;
}
Ta forma jest tak zwięzły jak każdy z powyższych form, ale o wiele łatwiej zrozumieć:
sub _atan {
my($y, $x) = @_;
return atan($y/$x)
unless $x == 0;
return $y < 0 ? -pip2 : pip2;
}
zagnieżdżonych klauzule "/ else" mogą być trudne do zrozumienia. Zachowując niewielką ostrożność podczas konstruowania kodu decyzyjnego można znacznie poprawić czytelność, a tym samym łatwość obsługi, zachowując jednocześnie zwięzłą ekspresję logiki bazowej.
Zapach kodu, który należy tutaj ustalić, to barokowa kombinacja operatora warunkowego (?:
) z formularzem modyfikatora oświadczeń if
. Zmieniając kolejność testów i starannie wybierając sposób, w jaki reprezentujemy logikę warunkową, byliśmy w stanie zachować zwięzłość i wyjaśnić kod.
Prawdopodobnie napiszę to używając 'unless ($ x) {...' –
Jest to operator warunkowy, a nie operator trójskładnikowy. :) – Ether
Podejrzewam, że był to * a * operator potrójny, a nie * operator trójskładnikowy :) –