Uważaj, aby nie tracić przejrzystości , dążąc do czytelności .
Chociaż if (user.ExistsInDatabase(db))
czyta ładniej niż if (user.CheckExistsInDatabase(db))
, rozważ przypadek klasy ze wzorcem budującym (lub dowolną klasą, na którą możesz ustawić stan):
user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
Nie jest jasne, czy ExistsInDatabase
chodzi o sprawdzenie, czy istnieje, czy o ustalenie faktu, że istnieje. Nie zapisałbyś if (user.Age())
ani if (user.Name())
bez wartości porównawczej, więc dlaczego jest if (user.Exists())
to dobry pomysł tylko dlatego, że ta właściwość / funkcja jest typu boolowskiego i możesz zmienić nazwę funkcji / właściwości, aby bardziej przypominała naturalny angielski? Czy to źle podążać za tym samym wzorcem, którego używamy dla innych typów niż logiczne?
W przypadku innych typów if
instrukcja porównuje zwracaną wartość funkcji z wartością w kodzie, więc kod wygląda mniej więcej tak:
if (user.GetAge() >= 18) ...
Czyli „jeśli użytkownik dot get wiek jest większy lub równy 18 ...” prawda - to nie jest „naturalny angielski”, ale twierdziłbym, że object.verb
nigdy nie przypominał naturalnego angielskiego i jest to po prostu podstawowy aspekt współczesnego programowania (np. wielu popularnych języków). Programiści generalnie nie mają problemu ze zrozumieniem powyższego stwierdzenia, więc czy następujące jest gorsze?
if (user.CheckExists() == true)
Który jest zwykle skracany do
if (user.CheckExists())
Następuje fatalny krok
if (user.Exists())
Chociaż powiedziano, że „kod jest czytany 10 razy częściej niż pisany”, bardzo ważne jest również, aby błędy były łatwe do wykrycia. Załóżmy, że masz funkcję o nazwie Exists (), która powoduje, że obiekt istnieje i zwraca wartość true / false na podstawie sukcesu. Możesz łatwo zobaczyć kod if (user.Exists())
i nie zauważyć błędu - błąd byłby znacznie bardziej oczywisty, gdyby kod był czytany if (user.SetExists())
na przykład.
Dodatkowo user.Exists () może z łatwością zawierać złożony lub nieefektywny kod, przechodząc do bazy danych w celu sprawdzenia czegoś. user.CheckExists () wyjaśnia, że funkcja coś robi.
Zobacz także wszystkie odpowiedzi tutaj: Konwencje nazewnictwa: Jak nazwać metodę, która zwraca wartość logiczną?
Na koniec - po „Tell Don't Ask” wiele funkcji, które zwracają prawda / fałsz, i tak znika, a zamiast pytać obiekt o jego stan, każesz mu zrobić coś, co może zrobić w inny sposób sposoby oparte na jego stanie.
isBabbyFormed