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.