Oto bardzo uproszczony przykład . To niekoniecznie jest pytanie specyficzne dla języka i proszę zignorować wiele innych sposobów pisania funkcji i zmian, które można w niej wprowadzić. . Kolor jest wyjątkowego rodzaju
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
else
{
return "No you can't";
}
}
Wielu ludzi, których spotkałem, ReSharper, i ten facet (którego komentarz przypomniał mi, że chciałem o to zapytać od dłuższego czasu) zaleciłby przeformułowanie kodu w celu usunięcia else
bloku, pozostawiając to:
(Nie pamiętam, co powiedziała większość, mógłbym nie zapytać inaczej)
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
return "No you can't";
}
Pytanie: Czy wprowadzono wzrost złożoności poprzez pominięcie else
bloku?
Mam wrażenie, że else
bardziej bezpośrednio określa intencje, stwierdzając, że kod w obu blokach jest bezpośrednio powiązany.
Dodatkowo uważam, że mogę zapobiec subtelnym błędom logicznym, szczególnie po późniejszych modyfikacjach kodu.
Weźmy tę odmianę mojego uproszczonego przykładu (ignorując fakt, że or
operator, ponieważ jest to celowo uproszczony przykład):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
Ktoś może teraz dodać nowy if
blok na podstawie warunku po pierwszym przykładzie bez natychmiastowego prawidłowego rozpoznania pierwszego warunku nałożenia ograniczenia na swój własny warunek.
Jeśli else
blok byłby obecny, ktokolwiek dodałby nowy warunek, byłby zmuszony przenieść zawartośćelse
bloku (i jeśli w jakiś sposób go nadpisuje, heurystyka pokaże, że kod jest nieosiągalny, czego nie robi w przypadku if
ograniczenia jednego) .
Oczywiście istnieją inne sposoby zdefiniowania konkretnego przykładu, z których wszystkie zapobiegają tej sytuacji, ale to tylko przykład.
Długość podanego przeze mnie przykładu może zniekształcać wizualny aspekt tego, więc załóżmy, że przestrzeń zajmowana przez nawiasy jest względnie nieistotna dla reszty metody.
Zapomniałem wspomnieć o przypadku, w którym zgadzam się z pominięciem bloku else, i kiedy używam if
bloku do zastosowania ograniczenia, które musi być logicznie spełnione dla całego następującego kodu, takiego jak kontrola zerowa (lub inne zabezpieczenia) .
else
klauzuli (według mojego gustu będzie jeszcze bardziej czytelny, pomijając niepotrzebne nawiasy. Myślę jednak, że przykład nie jest dobrze wybrany, ponieważ w powyższy przypadek napisałbym return sky.Color == Color.Blue
(bez if / else). Przykład z innym typem zwrotu niż bool prawdopodobnie by to wyjaśnił