Konwencje nazewnictwa dla metod Java, które zwracają wartość logiczną (bez znaku zapytania)


95

Lubię używać znaku zapytania na końcu nazw metod / funkcji w innych językach. Java mi na to nie pozwala. Jako obejście, jak inaczej mogę nazwać logiczne metody zwracające w Javie? Korzystanie z is, has, should, canz przodu dźwięk metoda dobrze dla niektórych przypadkach. Czy jest lepszy sposób na nazwanie takich metod?

Na przykład createFreshSnapshot?


2
Jaki język dopuszcza ?w nazwie metody?
— SLaks

11
@SLaks, Scheme, Ruby ...
— Skilldrick

w schemacie zawsze umieszczamy pna końcu nazwy metody
— Erick Robertson

@Erick: nie zawsze, ale „p” jest standardowym sposobem oznaczania predykatów
— Jason S,

my = moja klasa licencjacka zawsze tak robiła. Nigdy nie użyłbym tej konwencji w Javie.
— Erick Robertson

Odpowiedzi:


125

Konwencja polega na zadawaniu pytania w imieniu.

Oto kilka przykładów, które można znaleźć w JDK:

isEmpty()

hasChildren()

W ten sposób nazwiska są odczytywane tak, jakby miały na końcu znak zapytania.

Czy kolekcja jest pusta?
Czy ten węzeł ma dzieci?

A zatem trueoznacza tak i falseoznacza nie.

Możesz też przeczytać to jak stwierdzenie:

Kolekcja jest pusta.
Węzeł ma dzieci

Uwaga:
czasami możesz chcieć nazwać metodę podobną do createFreshSnapshot?. Bez znaku zapytania nazwa sugeruje, że metoda powinna tworzyć migawkę, zamiast sprawdzać, czy jest wymagana.

W takim przypadku powinieneś przemyśleć, o co tak naprawdę prosisz. Coś w rodzaju isSnapshotExpiredjest o wiele lepszą nazwą i przekazuje to, co powie ci metoda, gdy zostanie wywołana. Postępowanie według takiego schematu może również pomóc w utrzymaniu większej liczby funkcji w czystości i bez skutków ubocznych.

Jeśli do wyszukiwarki Google dla isEmpty()w API Javy, można uzyskać wiele wyników.


a co z createFreshSnapshot?
— letronje

4
@letr, cóż, prawdopodobnie zmieniłbym jego nazwę na świeci isSnapshotExpiredlub coś w tym stylu. (na podstawie twoich kryteriów)
— jjnguy

8
Omijam problem „createFrshSnapshot”, używając słowa „should” - tj. „ShouldCreateFreshSnapshot ()” (chociaż w tym przypadku isSnapshotExpired () jest lepsze)
— DJClayworth

1
Sprawdzam, czy wiadomości pulsu powinny być wysyłane shouldHeartbeat()metodą.
— Erick Robertson

Dlaczego tak myślisz isEmpty()i hasChildren()są to pytania , a nie twierdzenia ? W rzeczywistości czyta się nieco lepiej po angielsku, jeśli myślisz o tych nazwach jako o asercjach lub predykatach.
— rick

29

Jeśli chcesz, aby Twoja klasa była zgodna ze specyfikacją Java Beans , tak aby narzędzia wykorzystujące odbicie (np. JavaBuilders , JGoodies Binding ) mogły rozpoznawać boolowskie metody pobierające , użyj getXXXX()lub isXXXX()jako nazwy metody. Ze specyfikacji Java Beans:

8.3.2 Właściwości boolowskie

Dodatkowo, dla właściwości logicznych, pozwalamy metodzie pobierającej na dopasowanie do wzorca:

public boolean is< PropertyName > ();

Ta metoda „is < PropertyName >” może być dostarczona zamiast metody „get < PropertyName >” lub może być dostarczona jako dodatek do metody „get < PropertyName >”. W każdym przypadku, jeśli metoda „is < PropertyName >” jest obecna dla właściwości boolowskiej, użyjemy metody „is < PropertyName >” do odczytania wartości właściwości. Przykładową własnością logiczną może być:

public boolean isMarsupial();
public void setMarsupial(boolean m);

To mylące, kiedy mówisz, że public boolean is<PropertyName>(); wygląda jak rodzajowy.
— Erick Robertson

Hej, cytuję tylko specyfikację. Będę kursywą zgodnie ze specyfikacją.
— Jason S

4
Nie obchodzi mnie kompatybilność ziaren Java, po prostu chcę, aby moje nazwy metod brzmiały poprawnie :)
— letronje

4
Nawet jeśli nie przejmujesz się kompatybilnością z Javabeanami, warto przestrzegać konwencji nazewnictwa, ponieważ wykroczyła ona daleko poza pierwotny zakres „fasoli” konfigurowanych w IDE. Na przykład, jeśli używasz isEmpty jako nazwy metody, możesz wywołać tę metodę z JSP za pomocą object.empty, jednak nie możesz wywołać metod z innymi prefiksami, więc nie możesz użyć object.children do wywołania object.hasChildren (). Dlatego JSP i EL (język wyrażeń) umożliwiają dostęp do właściwości języka Javabeans. Wielka wygrana, jeśli o mnie chodzi.
— Stijn de Witt

JavaBeans jest bardzo specyficzna, dziękuję za przypomnienie. Często się zastanawiam i wydaje mi się, że utknąłem z przedrostkiem „jest”, ale w rzeczywistości wcale.
— Snicolas

26

Chcę opublikować ten link, ponieważ może to jeszcze bardziej pomóc użytkownikom sprawdzającym tę odpowiedź i szukającym bardziej konwencji w stylu java

Wskazówki dotyczące stylu programowania w języku Java

Punkt „2.13 to przedrostek powinien być używany dla zmiennych i metod boolowskich”. jest szczególnie istotne i sugeruje przedrostek is .

Przewodnik po stylu sugeruje:

Istnieje kilka alternatyw dla przedrostka is, które lepiej pasują do niektórych sytuacji. Są to prefiksy, które mają , mogą i powinny :

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Jeśli zastosujesz się do Wytycznych, uważam, że odpowiednia metoda będzie nazwana:

shouldCreateFreshSnapshot()

2
FYI, istnieją wytyczne są objęte prawami autorskimi Usługi oprogramowania geotechnicznego. To powiedziawszy, odwołali się do źródła na dole, aby zasugerować, że są legalne.
— Donal Lafferty

11

W przypadku metod, które mogą się nie powieść, to znaczy określasz wartość logiczną jako typ zwracany, użyłbym przedrostka try:

if (tryCreateFreshSnapshot())
{
  // ...
}

We wszystkich innych przypadkach użyj przedrostków, takich jak is.. has.. was.. can.. allows.....


15
Ale try nie przekazuje, że jest to pytanie (ma wartość zwracaną).
— Steve Kuo

Nigdy nie zwracaj wartości logicznej, aby wskazać, czy metoda zawiodła, czy nie. Jeśli metoda nie powiodła się, zgłoś wyjątek. Wyobraź sobie, że metoda zawiodła i otrzymujesz błąd, jak określić, co dokładnie poszło nie tak?
— Wouter van Koppen

5

Standardowo używa się przedrostka „jest” lub „ma”. Na przykład isValid, hasChildren.


2

isto ten, z którym się spotykałem częściej niż jakikolwiek inny. Cokolwiek ma sens w obecnej sytuacji, jest jednak najlepszą opcją.


0

Chcę wskazać inne spojrzenie na tę ogólną konwencję nazewnictwa, np .:

zobacz java.util.Set :boolean add​(E e)

gdzie uzasadnieniem jest:

wykonaj pewne przetwarzanie, a następnie zgłoś, czy się powiodło, czy nie .

Chociaż returnrzeczywiście jest booleanto nazwa metody, powinna wskazywać na zakończenie przetwarzania zamiast typu wyniku (boolean w tym przykładzie).

Twój createFreshSnapshotprzykład wydaje mi się bardziej związany z tym punktem widzenia, ponieważ wydaje się oznaczać to: utwórz nową migawkę, a następnie zgłoś, czy operacja tworzenia zakończyła się powodzeniem. Biorąc pod uwagę to rozumowanie, nazwa createFreshSnapshotwydaje się być najlepsza dla twojej sytuacji.


1
Nie jestem pewien, dlaczego cię odrzucają, zgadzam się. Chociaż unikam jej używania, ponieważ w ogóle nie jest semantyczna, jest to konwencja używana przez wiele wewnętrznych interfejsów API Java.
— Kamil Bęben

1
Chyba dlatego, że początkowo napisałem tylko „Set: boolean add (E e)”, więc ludzie nie zauważyli, że chodzi o dobrze znanego java.util.Set; a może dlatego, że mój angielski jest taki kiepski: D. Dzięki za upvote :)
— adrhc
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.