Java-Boolesche Getter "is" vs "are"

89

Ich weiß, dass die Konvention in Java für boolesche Getter das Präfix "is" enthält.

isEnabled
isStoreOpen

Aber was ist, wenn das Thema Plural ist? Das heißt, was ist, wenn ich nicht wissen möchte, ob ein Geschäft geöffnet ist, sondern wissen möchte, ob alle Geschäfte geöffnet sind?

isStoresOpen() macht auf Englisch keinen Sinn.

Ich bin versucht, Getter zu schreiben wie:

areStoresOpen
areDogsCute
areCatsFuzzy

Und ich denke , dass Sinn machen würde, aber ich habe von anderen gesagt worden , dass ich es einfach aufzusaugen und verlassen unterliegen Verb Vereinbarung und die Nutzung isStoresOpen, isDogsCute, isCatsFuzzy.

Was soll ich für Boolesche Getter tun, die mit einem Plural-Thema arbeiten?

Kodai
quelle
3
Ich sehe nie zuvor einen are*()Getter.
rekire
21
Ich schreibe immer are*()Getter, wenn sie grammatikalisch korrekt sind.
Roddy der gefrorenen Erbsen
2
Wenn Ihr Objekt eine Bean ist, ich glaube , Sie kleben müssen entweder isoder has...
assylias
4
Wenn Sie are * () getter verwenden, sollte es in den meisten Fällen boolean [] zurückgeben, denke ich.
Juvanis
2
Sehr gute Frage. Ich habe mich das ziemlich gefragt. Wie viele der Antworten bereits gezeigt haben, verwenden die meisten Frameworks, IDEs und alles, was auf einer Konvention beruht, auf die ich gestoßen bin, das Muster "get" / "set" / "is". Selbst wenn dies in Ihrer Anwendung kein Problem darstellt, würde ich diese Konvention trotzdem befolgen - Ihr Code ist (auch von Ihnen) viel einfacher zu befolgen, wenn Sie eine konsistente Namenskonvention beibehalten (auch wenn er manchmal nicht grammatikalisch seltsam klingt ).
Paul Richter

Antworten:

57

Ich kann mich nicht erinnern, aus welchem ​​Buch dies stammt, aber das Wesentliche ist, dass Code viel öfter gelesen wird, als er geschrieben wurde. Schreiben Sie zur besseren Lesbarkeit.

John
quelle
20
Sauberer Code - Robert Martin
John B
8
Aber sei sehr vorsichtig, dass du nicht zu weit gehst. storesAreOpen()wäre wahrscheinlich die grammatikalischste (wegen if(storesAreOpen())), aber der boolesche Teil des Namens ist jetzt in der Mitte des Methodennamens versteckt, wodurch Java-Konventionen und lesbarer Code verletzt werden.
Izkata
107
Ich verstehe nicht, wie dies die akzeptierte Antwort ist. Es gibt nicht einmal eine endgültige Antwort auf die Frage.
Tamzin Blake
3
Er beantwortet die Frage sehr allgemein. Es ist wahr, dass er nicht auf die Einzelheiten eingeht, aber dies ist eine Antwort. Es mag banal erscheinen, aber es hat einen Wert (mindestens 24 Leute denken das).
George Stocker
4
Um die Antwort zu verdeutlichen, möchte ich hinzufügen, dass areStoresOpen () hier eine gute Wahl ist.
Kiedysktos
91

Wie wäre es mit ausreichend Englisch und Java-Standard:

isEveryStoreOpen() oder isEachCatCute()

Wenn ich Zweifel am richtigen Wort habe, schlage ich immer gerne den Thesaurus auf.

gesättigt neun
quelle
18
+1, dies zeigt deutlich, ob der zurückgegebene Wert im Gegensatz zu dem mehrdeutigen isStoresOpen () isEveryStoreOpen () oder isAnyStoreOpen () bedeutet.
Imre
4
+1 Dies sollte die akzeptierte Antwort sein! Mach Sinn grammatisch während der Java hält booleans isPräfix Konvention. Außerdem bietet es ein paar zusätzliche Informationen, die für nicht-englische Muttersprachler, die zufällig die Codebasis pflegen , sehr nützlich sind.
Higuaro
Diese Antwort hat mein Leben verändert! Und es sollte die akzeptierte Antwort sein.
Marcel Blanck
34

Die Konvention besteht darin, der Getter-Methode "is" voranzustellen, nicht die variale selbst.

z.B

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

und

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () macht auf Englisch keinen Sinn.

Grammatisch mag es keinen Sinn ergeben, aber es folgt der Konvention und sieht lesbar genug aus.

Bhesh Gurung
quelle
Ihre Antwort macht Sinn und ich weiß das zu schätzen. Ich denke, von einer maßgeblichen richtigen / falschen Position aus haben Sie Recht. Ich möchte einfach nicht, dass eine Konvention, die uns helfen soll, indem sie offensichtlich, klar und leicht verständlich ist, diesen Zweck aufgibt, um ihre Regeln einzuhalten. Aber du hast recht - so ist es, und danach habe ich gefragt.
Kodai
@ Kodai: Ich denke, es sollte nicht als Regel betrachtet werden, sondern nur eine Konvention. Ich glaube jedoch, dass es der richtige Weg ist, Code zu schreiben, der nicht der Konvention entspricht, wenn dies nicht erforderlich ist, um den Code lesbar zu machen.
Bhesh Gurung
18

Die Java Bean-Spezifikation besagt, dass sie getfür Getter verwendet werden soll, es sei denn, es handelt sich um eine booleandamalige Verwendung is. areist nicht Standard und wird von nichts erkannt, was eine Standard-Bean-Benennung erwartet.

Steve Kuo
quelle
17

Viele Tools erwarten isoder getwerden es wahrscheinlich nicht erkennen are.

Versuchen Sie, sie wie getDogsAreFuzzy()oder getStoresAreOpen()oder ähnliche Dinge neu zu formulieren , um die Kompatibilität und Konventionen zu verbessern .

Kevin Rubin
quelle
Ja. Tools wie Bohnen Dienstprogramme zählen auf das Wort ist boolean Getter zu finden.
Nalply
4

- isEnabled() kann auch wie getEnabled()in geschrieben werden Java naming conventions.

- Es ist nur eine gute Angewohnheit, die Namenskonventionen zu befolgen und bei der Arbeit zu helfen Java Beans.

Kumar Vivek Mitra
quelle
3

Im Allgemeinen denke ich, dass Code so leicht wie möglich lesbar sein sollte, damit eine Methode fast als Absatz gelesen werden kann (wie von Clean Code). Daher würde ich die Methode so nennen, dass sie so einfach wie möglich klingt / liest und der Grammatikregel von folgt are. Mit modernen IDEs ist es einfach, Methoden zu finden, ohne speziell nach get/ zu suchenis .

Kumar macht jedoch einen guten Punkt über Bohnen. Viele Tools suchen nur nach get/ is. In diesem Fall könnte ich beide Methoden in Betracht ziehen. Eine zur Erleichterung des Lesens und eine zur Verwendung mit Werkzeugen.

John B.
quelle
3

In welcher Sprache schreiben Sie: Englisch oder Java ?

Wenn ich Java-Code lese, erwarte ich, dass die Dinge da sind. Wenn ich nach beiden Gettern mit is- und are- Präfixen suche, ist dies komplizierter als die Suche nach nur einem Präfix.

Wenn ich jedoch morgens Zeitung lese, suche ich nichts, sodass Sie auf traditionellere Weise Englisch schreiben können.

return 0;

Ilya Gazman
quelle
3

In Ihrer Frage fragen Sie explizit nach Gettern. Ein Getter gibt einige Informationen zu einer Instanz Ihrer Klasse zurück. Zum Beispiel hast du eine Klasse Store. Jetzt,isStoreOpen ist ein perfekter Methodenname für einen Getter.

Als Nächstes erwähnen Sie eine Methode, mit der überprüft wird, ob alle Geschäfte geöffnet sind. Diese Methode ist überhaupt kein Getter, da sie keine Informationen über eine Instanz zurückgibt, sondern für alle. Natürlich, es sei denn, es gibt eine KlasseStores . In diesem Fall sollten Sie Ihr Design überdenken, da Java bereits über Möglichkeiten zum Speichern einer Reihe von Instanzen verfügt, z. B. Arrays oder Sammlungen, sodass Sie keine zusätzlichen Klassen schreiben müssen.

Wenn dies nicht der Fall ist, ist dieser Methodenname vollkommen in Ordnung. Eine Alternative kann gerecht seinallStoresOpen ohne das 'ist' sein.

TL; DR: Wenn Sie mit mehreren Instanzen zu tun haben, ist dies kein Getter. Wenn ja, ist Ihr Design schlecht.

Kirill Rakhman
quelle
2

Ganz ehrlich würde ich sagen definitiv vergessen are*und dabei bleiben is*. Stellen Sie sich das "is"als variable Bedeutung vor und machen Sie wenn möglich einen besseren Namen.

Ich würde sagen, isStoresOpen klingt nicht so schlecht, aber Sie können isStoresAreOpen erstellen, wenn das für Sie besser klingt.

Aber meine allgemeine Idee wäre, mich an die Konventionen zu halten. Was "get" für Getter und "is" für boolesche Typen verwendet. Persönlich denke ich, dass die Verwendung von "ist" manchmal schon problematisch ist. Ja - es sieht unter "wenn" -Bedingungen gut aus, aber manchmal schreibe ich beim Codieren einfach "get" und überprüfe die Dropdown-Liste auf meine benötigte Variable und frage mich, was falsch ist und warum ich es nicht finden kann, dann merke ich es beginnt mit "ist" ...

Arturas M.
quelle
1

In der objektorientierten Programmierung sollte dies selten, wenn überhaupt, auftreten, da Storeoder Catoder was Sie haben, eine separate Klasse mit einer eigenen isOpen()oder einer eigenen isFuzzy()Methode sein sollte. Wenn Sie einen höheren Typ haben, sollten Sie in Betracht ziehen, ihn auf die atomarere Ebene aufzuteilen, die Sie tatsächlich verwenden. Im Allgemeinen sollten Objekte nicht auf der untersten Ebene plural sein.

Asteri
quelle
1

isStoresOpen () in diesem StoresOpen scheint wie ein Plural,

Wenn Sie die Java-Namenskonvention und die Java-Beans-Standards befolgen, haben sie vordefinierte Präfixe für Boolesche und andere Typen. Daher sollten Sie die Java-Beans-Namenskonvention befolgen.

Kommen wir zu Ihrem Punkt, wenn Sie Geschäfte öffnen wie in einer englischen Perspektive sehen, sieht es ja wie Plural aus. Nehmen Sie noch einmal tiefe Beobachtung in dieses Wort,

Hier

storeOpen ist Plural nach englischer Grammatik,

Das Ergebnis von isStoresOpen ist kein Plural, sondern ein Singular oder man kann sagen, dass es in Bezug auf die Programmierkonvention skalar ist.

Es ist boolesch, nur wahr oder falsch

Nicht wie Ihre englische Pluralaussage wahr oder falsch

Kein Array von wahr oder falsch oder keine Sammlung von wahr oder falsch

Hier können wir also sagen, dass es hier um den Wert geht, der von dieser booleschen Bean-Methode zurückgegeben wird, und nicht um den Namen, der der Eigenschaft der Klasse gegeben wurde, um auf eine reale Entität zu verweisen.

Eine weitere wichtige Sache ist, dass, wenn solche booleschen Eigenschaften in Klassen verwendet werden und diese von vordefinierten Bibliotheken in einem beliebigen Framework verwendet werden, das Framework mit dem Präfix 'verwendet wird. is ' zum Abrufen von booleschen Werten verwendet wird.

Warum bedeutet das, dass es nicht viel schlauer ist als Sie, da Sie die englische Grammatik wie Plural / Singular, Multiplexer usw. kennen?

Anil kumar
quelle