Proste pytanie, z punktu widzenia czytelności, jaką nazwę preferujesz dla metody logicznej:
public boolean isUserExist(...)
lub:
public boolean doesUserExist(...)
lub:
public boolean userExists(...)
api
naming-conventions
readability
Yuval Adam
źródło
źródło
isBabbyFormed
getUserExistence
,userIsNotExtinct
,userHasExistentialState
Etc ...Odpowiedzi:
Wolałbym. Ponieważ sprawia, że testy warunkowe bardziej przypominają naturalny angielski:
Ale myślę, że nie ma sztywnej i szybkiej zasady - po prostu bądź konsekwentny
źródło
if
? Jeśli mają skutki uboczne, to jeszcze bardziej przypomina zapach.if IsUserExisting()
iif DoesUserExist()
wygląda przerażająco i należy ich unikać.userExists
, jaką nazwę zmiennej zadeklarujesz?userExists
jest dobre dla zmiennych, a nie metod. Jak napisał @Oskar - to brzmi jak stwierdzenie, a nie pytanie.Powiedziałbym
userExists
, ponieważ w 90% przypadków mój kod wywoławczy będzie wyglądał tak:i brzmi bardzo dosłownie po angielsku.
if isUserExist
iif doesUserExist
wydają się zbędne.źródło
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())
aniif (user.Name())
bez wartości porównawczej, więc dlaczego jestif (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: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?Który jest zwykle skracany do
Następuje fatalny krok
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ł czytanyif (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.
źródło
Suppose you had a function called Exists() which causes the object to exist
To już jest problem. Taka metoda powinna być czasownikiem, na przykładCreate
. Przynajmniej tak by byłoExist
, ale „istnieć” jako czasownik jest rzadko używany.It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.
To jest bardzo jasne. Twierdzę, że większość programistów byłaby zaskoczona, gdyby spowodowało to coś innego niż tylko zwrócenie wartości logicznej.Most developers
jest kluczem do twojego zdania. Powiedziałbym, żeall developers
byłbym zaskoczony, gdybyCheckExists()
zrobił coś innego niż sprawdzenie, czy coś istnieje. To nieExists()
jest okropne imię, po prostuCheckExists()
jest to lepsze imię, a to pytanie brzmi, jako ogólna zasada, jaki jest najlepszy wzorzec nazewnictwa? Odpowiedź brzmi: potraktuj ją jak każdą inną funkcję, rozpocznij nazwę od czasownika i nie używaj innego wzorca tylko dlatego, że zwraca wartość logiczną.Celem czytelności zawsze powinno być pisanie kodu jak najbardziej zbliżonego do języka naturalnego. Więc w tym przypadku
userExists
wydaje się najlepszym wyborem. Jednak użycie przedrostka „jest” może być poprawne, na przykład w innych sytuacjachisProcessingComplete
.źródło
ProcessingIsComplete
bliżej języków naturalnych? Na przykład: if (ProcessingIsComplete ())Wybrałbym userExists (), ponieważ 1) ma to sens w języku naturalnym i 2) jest zgodne z konwencjami API, które widziałem.
Aby sprawdzić, czy ma to sens w języku naturalnym, przeczytaj to na głos. „Jeśli użytkownik istnieje” brzmi bardziej jak poprawne angielskie wyrażenie niż „jeśli użytkownik istnieje” lub „jeśli istnieje użytkownik”. „Jeśli użytkownik istnieje” byłoby lepsze, ale „the” jest prawdopodobnie zbędne w nazwie metody.
Aby sprawdzić, czy plik istnieje w Java SE 6, należy użyć funkcji File.exists () . Wygląda na to, że będzie tak samo w wersji 7 . C # używa tej samej konwencji , co Python i Ruby . Miejmy nadzieję, że jest to zbiór wystarczająco zróżnicowany, aby nazwać to odpowiedzią niezależną od języka. Ogólnie rzecz biorąc, byłbym po stronie metod nazewnictwa zgodnych z API twojego języka.
źródło
Są rzeczy do rozważenia, o których myślę, że pominęło kilka innych odpowiedzi
Zależy to od tego, czy jest to metoda klasy C ++, czy funkcja C. Jeśli jest to metoda, prawdopodobnie zostanie wywołana
if (user.exists()) { ... }
lubif (user.isExisting()) { ... }
nie
if (user_exists(&user))
. To jest powód, dla którego standardy kodowania określają, że metody bool powinny zaczynać się od czasownika, ponieważ będą one czytane jak zdanie, gdy obiekt będzie przed nimi.Niestety wiele starych funkcji C zwraca 0 dla sukcesu i niezerowe dla niepowodzenia, więc może być trudne określenie używanego stylu, chyba że śledzisz wszystkie funkcje bool zaczynające się od czasowników lub zawsze porównując z prawdą w ten sposób
if (true == user_exists(&user))
źródło
Moja prosta zasada na to pytanie jest taka:
Jeśli metoda boolowska ma już czasownik, nie dodawaj go. W przeciwnym razie rozważ to. Kilka przykładów:
źródło
Czysto subiektywne.
Wolę,
userExists(...)
bo wtedy takie stwierdzenia czytaj lepiej:lub
źródło
W tym konkretnym przypadku pierwszym przykładem jest tak okropny angielski, że aż się krzywię.
Prawdopodobnie wybrałbym numer trzy ze względu na to, jak to brzmi podczas czytania stwierdzeń if. „Jeśli użytkownik istnieje” brzmi lepiej niż „Jeśli użytkownik istnieje”.
Zakłada się, że będzie on używany w testach instrukcji jeśli oczywiście ...
źródło
Podoba mi się każdy z tych:
źródło
Nazwy metod służą czytelności, najlepiej pasowałyby tylko te, które pasują do całego kodu, które w większości przypadków zaczynają się od warunków, więc subjectPredicate ma naturalną strukturę zdania.
źródło
Dlaczego więc nie zmienić nazwy nieruchomości?
źródło