Jaka jest konwencja nazewnictwa dla pola boolowskiego dla jego metody pobierającej / ustawiającej?

178

Na przykład.

boolean isCurrent = false;

Jak nazwiesz jego getter i setter?

user496949
źródło
2
Zakładam, że odnosisz się do JavaBeans, w takim przypadku odpowiedź @Jigar Joshi jest poprawna. Jeśli jednak pytasz o ogólne metody pobierające / ustawiające, jedyną konwencją jest to, że metody zawierają nazwę pola, a metoda pobierająca nie przyjmuje żadnych argumentów i zwraca wartość, funkcja ustawiająca przyjmuje jeden argument i nie zwraca żadnej wartości lub zwraca sam obiekt. zobacz Buffer jako przykład innego podejścia do pobierania / ustawiania.
Peter Lawrey,

Odpowiedzi:

255

Załóżmy, że tak

boolean active;

Metoda akcesorów byłaby

public boolean isActive(){return this.active;}

public void setActive(boolean active){this.active = active;}

Zobacz też

Jigar Joshi
źródło
9
Czy mógłbyś wskazać sekcję konwencji kodu firmy Sun, w której są szczegółowo omówione boolowskie nazwy pobierające? Nie mogę tego znaleźć.
Konstantin Pelepelin
4
Mam pole boolowskie o nazwie hasCustomName, jak powinienem nazwać jego metody pobierające i ustawiające ? Czy setHasCustomName[setter]i hasCustomName[getter]dobrze?
Hadi
@Hadi po prostu nazwij swoją zmienną „customerName” i wygeneruj dla niej metodę ustawiającą getter n. Oczekiwane getter i setery to public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
Assegd,
1
jak przeszliśmy od nazwy niestandardowej do nazwy klienta? ;)
Kartik Chugh
1
@Assegd Nazwanie go „customerName” lub „customName” jest mylące i nie oznacza, że ​​jest to wartość logiczna. Widząc zmienną, spodziewałbym się, że zawiera ona nazwę. W takim przypadku powinien on nosić nazwę IMO „hasCustomName”.
Nathan
83

http://geosoft.no/development/javastyle.html#Specific

  1. is przedrostek powinien być używany dla zmiennych i metod boolowskich.

    isSet, isVisible, isFinished, isFound,isOpen

Jest to konwencja nazewnictwa metod logicznych i zmiennych używanych przez firmę Sun dla podstawowych pakietów Java. Użycie przedrostka is rozwiązuje częsty problem związany z wybieraniem złych nazw logicznych, takich jak status lub flaga. isStatus lub isFlag po prostu nie pasują, a programista jest zmuszony do wybrania bardziej znaczących nazw.

Metody ustawiające dla zmiennych boolowskich muszą mieć ustawiony przedrostek jak w:

void setFound(boolean isFound);

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;
Narayan
źródło
7
Więc jeśli istnieje właściwość boolowska hasData, jak wyglądałby seter? Z całą pewnością setData(bool hasData)wygląda to dla mnie strasznie źle ...
Franz B.
7
@FranzB. Użyłbym setHasData (...)
user362178
2
Dla tych, którzy chcą się następująco JavaBeans specifcation, wydaje się, że has, can, shouldprefiksy nie są częścią specyfikacji. Zobacz specyfikację JavaBeans 1.01 sekcja 8.3.
VCD
@Andrew cześć. Kiedy używam prefiksu „is” w mojej zmiennej i wysyłam wartość tej zmiennej z mojego pliku js w danych, zawsze podaje mi wartość jako fałsz. A jeśli usunę prefiks „jest”, to działa absolutnie dobrze. Jaki może być tego powód? Z góry dziękuję.
Me_developer
1
Setter jest prosty, ponieważ getter, którego musiałem użyć w boolean isIsCurrent(){...}przeciwnym razie, narzekał framework używany do deserializacji obiektu getter not found for property isCurrent.
Maurizio Lo Bosco
67

Dla pola o nazwie isCurrentprawidłowe nazewnictwo pobierające / ustawiające to setCurrent()/ isCurrent()(przynajmniej tak myśli Eclipse), co jest bardzo mylące i można je prześledzić wstecz do głównego problemu:

Twoje pole nie powinno być isCurrentw pierwszej kolejności wywoływane . Jest to czasownik, a czasowniki są nieodpowiednie do reprezentowania stanu obiektu. Zamiast tego użyj przymiotnika, a nagle twoje nazwy pobierające / ustawiające będą miały więcej sensu:

private boolean current;

public boolean isCurrent(){
    return current;
}

public void setCurrent(final boolean current){
    this.current = current;
}
Sean Patrick Floyd
źródło
4
Co jeśli wartość logiczna nie jest prymitywem? Jeśli to jest Boolean, czy powinno to być get, czy jest?
Arun
2
Nie, taka metoda mogłaby zwrócić wartość null, co spowodowałoby wyjątek NullPointerException. Ale w pierwszej kolejności starałbym się uniknąć powrotu Boolean
Sean Patrick Floyd
3
@Arun Myślę, że zamiast tego powinno być ustawione / get, jeśli set / jest, ponieważ Boolean jest obiektem zamiast prymitywnym, ponieważ ma 3 statystyki, fałsz, prawda lub null.
Al-Mothafar
1
IntelliJ domyślnie używa getprefiksu podczas pobierania Booleanvs isdla aboolean
jocull
1
@jocull i to jest prawidłowe zachowanie, zgodnie ze specyfikacją JavaBeans
Sean Patrick Floyd
6

Myślę , że byłoby to:

void setCurrent(boolean current)
boolean isCurrent()
miku
źródło
1
Podoba mi się ta konwencja, ale konwencje tak naprawdę nie mają znaczenia. Najważniejsze to trzymać się tego, który wybrałeś.
Clement Herreman
4
Konwencje @Clement mają znaczenie, gdy polegasz na narzędziach korzystających z tych konwencji. JavaBeans to konwencja z szerokim wsparciem w wielu bibliotekach (JSP / JSF / Spring / Groovy żeby wymienić tylko kilka). Łamanie konwencji oznacza przełamanie sposobu działania tych bibliotek.
Sean Patrick Floyd
1
@Sean Right, z wyjątkiem frameworka, który opiera się na konwencji zamiast konfiguracji. W tym przypadku konwencje są narzucane przez framework, więc nic nie wybierasz. Dobra uwaga.
Clement Herreman
5

Może czas zacząć poprawiać tę odpowiedź? Osobiście chciałbym głosować na setActive()i unsetActive()(alternatywy może być setUnActive(), notActive(),disable() , itd. W zależności od kontekstu), ponieważ „setActive” zakłada go aktywować w każdej chwili, co nie. Powiedzenie „setActive”, ale w rzeczywistości usunięcie stanu aktywnego jest trochę sprzeczne z intuicją.

Innym problemem jest to, że nie można nasłuchiwać konkretnego zdarzenia SetActive w sposób CQRS, trzeba by odsłuchać „setActiveEvent” i określić wewnątrz, czy słuchacz jest ustawiony jako aktywny, czy nie. Lub oczywiście określ, które zdarzenie wywołać podczas dzwonienia, setActive()ale jest to sprzeczne z zasadą Separacji obaw.

Dobrą lekturą na ten temat jest artykuł na temat FlagArgument autorstwa Martina Fowlera: http://martinfowler.com/bliki/FlagArgument.html

Jednak wywodzę się z PHP i widzę, że ten trend jest coraz częściej przyjmowany. Nie jestem pewien, jak bardzo to żyje z rozwojem Java.

Christian Vermeulen
źródło
-1
private boolean current;

public void setCurrent(boolean current){
    this.current=current;
}

public boolean hasCurrent(){
    return this.current;
}
Mkne
źródło
3
ma aktualne co? Myślę, że hasużywany do BO lub takiej usługi z pewnym przetwarzaniem, podczas gdy dla POJO jest is. i dodaj opis swojej odpowiedzi.
Al-Mothafar
-3
Setter: public void setCurrent(boolean val)
Getter: public boolean getCurrent()

W przypadku wartości logicznych możesz również użyć

public boolean isCurrent()
Suraj Chandran
źródło
11
Ponieważ PO zawiera pytanie o wartości logiczne. Funkcja pobierająca z przedrostkiem „get” jest (czytaj: nie powinna) nigdy być używana dla wartości boolowskich.
Harold
-4

Jako rozgrywający, co powiesz na:

// setter
public void beCurrent(boolean X) {
    this.isCurrent = X;
}

lub

// setter
public void makeCurrent(boolean X) {
    this.isCurrent = X;
}

Nie jestem pewien, czy te nazewnictwo ma sens dla rodzimych użytkowników języka angielskiego.

amekusa
źródło
1
Oni naprawdę nie mają
sensu
Ale brzmi fonetycznie może obiecująco z pewnymi atrybutami :)
seba.wagner