To wciąż zasada, czy już przesada?
Reguły, zasady – przemyślenia na ich temat ostatnio opanowały mój umysł, więc naturalną konsekwencją jego stanu są kolejne moje wpisy. I czuję, że to jeszcze nie koniec. Na blogu ostatnio jest bardziej filozoficznie, ale tak bywa, kiedy dokonuje się retrospekcji.
Dziś co nieco o regule nazywania warunków (wywodzącej się z reguły wydzielania metody). Chodzi w niej o to, aby wyrażenia logiczne występujące w kodzie zastępować metodami (funkcjami) o nazwie określającej ich sens, dzięki czemu nie jest konieczne analizowanie wyrażeń, a jedynie przeczytanie komunikatywnej nazwy metody (mamy czytelny kod). Oto przykłady:
// zamiast: result = x < y ? y : x; // powinno być: result = Max(x, y); // zamiast: if ((day == Days.Sa) || (day == Days.Su)) FreeTime(); // powinno być: if (Weekend(day)) FreeTime();
Oczywiście wymaga to dodatkowej pracy czyli wyodrębniania fragmentów kodu do oddzielnych metod, ale jest to koszt warty czytelności kodu:
private int Max(int x, int y) { return x < y ? y : x; } private bool Weekend(Days day) { return ((day == Days.Sa) || (day == Days.Su)); }
Teraz wystarczy jednak wyłączyć myślenie, by popaść w przesadę – zacząć nadużywać omawianej zasady. Wyobraźmy sobie taki kod:
if (day == Days.Su) AccessDenied();
i zastąpmy warunek zgodnie z zasadą:
if (ThisIsSunday(day)) AccessDenied();
albo:
if (x < 0) Transform(x);
zastąpmy:
if (Negative(x)) Transform(x);
Czy czytelność w obu wypadkach wzrosła? Nie, ona się nie zmieniła, a można by nawet zaryzykować twierdzenie, że w drugim przypadku zmalała, bo dopóki nie zorientujemy się, jakiego typu jest x nie możemy być pewni, czy chodzi o bycie ujemnym czy – chociażby – bycie negatywem (może x oznacza stan obrazu w trakcie obróbki).
W obu przypadkach nie ma sensu używać metody. Sam warunek – wyrażenie logiczne jest na tyle czytelne, że nie ma szans, aby było czytelniejsze ;).
Zatem stosując tę regułę, zawsze należy pamiętać, że służy ona nazywaniu warunków, które w formie wyrażenia logicznego nie są czytelne, tj. wymagają czasu na analizę. Jeśli są to proste warunki – należy je pozostawić w oryginalnej postaci. W ten sposób unikniemy przesady.