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.