Java boolowskie metody pobierające „jest” kontra „są”


92

Wiem, że w Javie konwencja dotycząca metody pobierającej wartości logiczne obejmuje przedrostek „jest”.

isEnabled
isStoreOpen

Ale co, jeśli temat jest w liczbie mnogiej? To znaczy, co jeśli zamiast chcieć wiedzieć, czy sklep jest otwarty, chciałem wiedzieć, czy wszystkie sklepy są otwarte?

isStoresOpen() nie ma sensu po angielsku.

Kusi mnie, żeby napisać gettery takie jak:

areStoresOpen
areDogsCute
areCatsFuzzy

I myślę, że miałoby sens, ale powiedziano mi przez innych, że należy po prostu ssać go i porzucenia tematu czasownika umowy i użytkowania isStoresOpen, isDogsCute, isCatsFuzzy.

W każdym razie, co powinienem zrobić dla boolowskich metod pobierających, które działają w liczbie mnogiej?


3
Nigdy wcześniej nie widziałem are*()gettera.
rekire

21
Zawsze piszę are*()gettery, jeśli są poprawne gramatycznie.
Roddy of the Frozen Peas

2
Jeśli twoim przedmiotem jest fasola, myślę, że musisz trzymać się jednego islub has...
assylias

4
jeśli używasz gettera * (), to w większości przypadków powinien on zwrócić wartość boolean [].
Juvanis,

2
Bardzo dobre pytanie. Sam się nad tym zastanawiałem, całkiem sporo. Jak już wskazywało wiele odpowiedzi, większość frameworków, IDE i wszystkiego, co opiera się na konwencji, z którą się spotkałem, używa wzorca „pobierz” / „ustaw” / „to”. Nawet jeśli nie jest to problemem w twojej aplikacji, mimo wszystko postępowałbym zgodnie z tą konwencją - twój kod będzie o wiele łatwiejszy do naśladowania (nawet przez ciebie), jeśli zachowasz spójną konwencję nazewnictwa (nawet jeśli czasami nie brzmi to gramatycznie dziwnie) ).
Paul Richter

Odpowiedzi:


58

Nie pamiętam, z której książki to pochodzi, ale najważniejsze jest to, że kod będzie czytany znacznie więcej razy, niż jest napisany. Napisz dla czytelności.


21
Czysty kod - Robert Martin
John B

John B: Nie czytałem tej książki; może przeczytałem o tym wzmiankę. Jednak kolejna książka na moją listę. :)
Jan

8
Ale bądź bardzo ostrożny, aby nie posuwać się za daleko. storesAreOpen()prawdopodobnie byłaby najbardziej gramatyczna (z powodu if(storesAreOpen())), ale logiczna część nazwy jest teraz ukryta w środku nazwy metody, co łamie konwencje języka Java i czytelny kod.
Izkata

3
Odpowiada na pytanie w bardzo ogólny sposób. To prawda, że ​​nie odnosi się do szczegółów, ale to jest odpowiedź. Może się to wydawać banalne, ale ma wartość (przynajmniej 24 osoby tak myślą).
George Stocker

4
w celu wyjaśnienia odpowiedzi dodałbym uwagę, że areStoresOpen () jest tutaj dobrym wyborem.
kiedysktos

96

Co powiesz na dość przyzwoity angielski i zgodny ze standardem Java:

isEveryStoreOpen() lub isEachCatCute()

W razie wątpliwości co do właściwego słowa zawsze lubię trafiać w tezaurus.


19
+1, to jasno pokazuje, czy zwrócona wartość oznacza isEveryStoreOpen () czy isAnyStoreOpen () w przeciwieństwie do niejednoznacznej isStoresOpen ().
Imre

5
+1 To powinna być zaakceptowana odpowiedź! Sens gramatycznie zachowując Java booleans iskonwencję prefiksu. Dodatkowo zawiera trochę dodatkowych informacji, które będą naprawdę przydatne dla tych, dla których angielski nie jest językiem ojczystym, którzy są opiekunami bazy kodu.
higuaro

1
Ta odpowiedź zmieniła moje życie! I powinna to być akceptowana odpowiedź.
Marcel Blanck

34

Konwencja jest taka, aby poprzedzać metodę pobierającą znakiem „is”, a nie samą zmienną.

na przykład

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

i

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () nie ma sensu w języku angielskim.

Może nie mieć sensu gramatycznie, ale jest zgodne z konwencją i wygląda wystarczająco czytelnie.


Twoja odpowiedź ma sens i doceniam to. Myślę, że z autorytatywnej dobrej / złej pozycji, masz rację. Po prostu nie chcę konwencji, która miała nam pomóc poprzez oczywiste, jasne i łatwe do zrozumienia porzucenie tego celu na rzecz przestrzegania jej zasad. Ale masz rację - tak to jest io to pytałem.
kodai

@kodai: Myślę, że nie należy tego traktować jako reguły, ale tylko konwencję. Ale uważam, że podczas pisania kodu niezgodnego z konwencją, jeśli nie jest to wymagane, właściwym rozwiązaniem jest uczynienie kodu czytelnym.
Bhesh Gurung

18

Specyfikacja Java Bean mówi, że ma być używana getdla metod pobierających, chyba że jest booleanto użycie następnie is. arejest niestandardowy i nie zostanie rozpoznany przez nic, co wymaga standardowego nazewnictwa Bean.


17

Wiele narzędzi oczekuje islub getprawdopodobnie nie rozpozna are.

Spróbuj je przeformułować, na przykład getDogsAreFuzzy()lub getStoresAreOpen()lub coś takiego, aby uzyskać lepszą zgodność i konwencje.


Tak. Narzędzia, takie jak media fasoli liczyć na słowo jest znaleźć logiczne pobierające.
nalply

4

- isEnabled() można również zapisać jako getEnabled()w Java naming conventions.

- To po prostu dobry nawyk, aby przestrzegać konwencji nazewnictwa, pomagać podczas pracy Java Beans.


3

Ogólnie uważam, że kod powinien być tak czytelny, jak to tylko możliwe, aby metoda mogła być prawie odczytywana jako akapit (co jest zgodne z Clean Code). Dlatego nazwałbym metodę tak, aby brzmiała / czytała tak łatwo, jak to możliwe, i postępowała zgodnie z regułą gramatyki are. Dzięki nowoczesnym IDE łatwo jest znaleźć metody bez szukania konkretnie get/ is.

Jednak Kumar ma rację co do fasoli. Wiele narzędzi będzie szukać tylko get/ is. W takim przypadku mógłbym rozważyć użycie obu metod. Jeden dla łatwości czytania, a drugi dla użycia narzędzi.


3

W jakim języku piszesz: angielski czy Java ?

Kiedy czytam kod Javy, spodziewam się, że coś tam będzie, zmuszając mnie do wyszukiwania obu metod pobierających, z prefiksami is i are , będzie bardziej skomplikowane niż wyszukiwanie tylko jednego prefiksu.

Jednak z drugiej strony, kiedy rano czytam gazetę, niczego nie szukam, więc możesz pisać bardziej tradycyjnym językiem angielskim.

return 0;


3

W swoim pytaniu wyraźnie pytasz o metody pobierające. Funkcja pobierająca zwraca pewne informacje o jednej instancji Twojej klasy. Na przykład masz klasę Store. To isStoreOpendoskonała nazwa metody dla metody pobierającej.

Następnie wspomnij o metodzie, która sprawdza, czy wszystkie sklepy są otwarte. Ta metoda w ogóle nie pobiera, ponieważ nie zwraca informacji o jednej instancji, ale o wszystkich. Oczywiście, chyba że jest klasa Stores. W takim przypadku powinieneś przemyśleć swój projekt, ponieważ Java ma już sposoby na przechowywanie wielu instancji, np. Tablic lub kolekcji, więc nie musisz pisać dodatkowych klas.

Jeśli tak nie jest, nazwa metody jest w porządku. Alternatywą może być po prostu allStoresOpen„jest”.

TL; DR: Jeśli masz do czynienia z wieloma instancjami, nie jest to metoda pobierająca. Jeśli tak, twój projekt jest zły.


2

Całkiem szczerze powiedziałbym, że zdecydowanie zapomnij o tym are*i trzymaj się is*. Pomyśl o tym "is"jako o znaczeniu zmiennej i utwórz lepszą nazwę, jeśli to możliwe.

Powiedziałbym, że isStoresOpen nie brzmi tak źle, ale możesz sprawić, że isStoresAreOpen będzie dla ciebie lepsze.

Ale moim ogólnym zamysłem byłoby trzymanie się konwencji. Który używa „get” dla pobierających i „is” dla typów boolowskich. Osobiście uważam, że używanie słowa „jest” jest już czasami problematyczne. Tak - wygląda dobrze w warunkach „jeśli”, ale czasami po prostu piszę „get” podczas kodowania i sprawdzam listę rozwijaną pod kątem mojej potrzebnej zmiennej i zaczynam się zastanawiać, co jest nie tak i dlaczego nie mogę tego znaleźć, a potem zdaję sobie z tego sprawę zaczyna się od „jest” ...


1

W programowaniu obiektowym powinno to rzadko, jeśli w ogóle, mieć miejsce od tego czasu Store lub Catlub co mieć powinny być oddzielne klasy, z własnym isOpen()lub isFuzzy()metody. Jeśli masz wyższy typ, rozważ podzielenie się na bardziej atomowy poziom, którego faktycznie używasz. Ogólnie rzecz biorąc, na najniższym poziomie obiekty nie powinny występować w liczbie mnogiej.


1

isStoresOpen () w tym StoresOpen wygląda jak liczba mnoga,

Kiedy przestrzegasz Konwencji nazewnictwa Java i standardów Java Beans, mają one predefiniowane przedrostki dla typów logicznych i innych, dlatego należy postępować zgodnie z konwencją nazewnictwa Java Beans.

Przejdźmy do twojego punktu Kiedy widzisz sklepyOtwarte tak, jak w perspektywie angielskiej, tak, wygląda to na liczbę mnogą. Jeszcze raz weź głęboką obserwację w to słowo,

Tutaj

storeOpen jest w liczbie mnogiej zgodnie z gramatyką angielską,

Wynik isStoresOpen nie jest liczbą mnogą, zamiast tego jest liczbą pojedynczą lub można powiedzieć, że jest skalarny z punktu widzenia konwencji programowania.

Wychodzi, że jest logiczna, po prostu prawda lub fałsz

Nie tak, jak twoje angielskie stwierdzenie liczby mnogiej prawda lub fałsz

Nie jest tablicą prawdy lub fałszu ani też kolekcjami prawdy lub fałszu

Więc tutaj możemy powiedzieć, że tutaj chodzi o wartość, która jest zwracana z tej metody ziaren boolean, a nie nazwę nadaną właściwości class, która wskazuje byt ze świata rzeczywistego.

Ważną rzeczą jest jeszcze jedno: ilekroć takie właściwości boolowskie są używane w klasach i są używane przez predefiniowane biblioteki w dowolnym frameworku, to framework z prefiksem użycia „ issłuży do pobierania wartości boolowskich,

dlaczego oznacza, że ​​nie jest tak mądrzejszy od ciebie, jak znasz gramatykę angielską, taką jak liczba mnoga / liczba pojedyncza, multiplekser itp.

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.