Namenskonventionen für Java-Methoden, die boolesche Werte zurückgeben (kein Fragezeichen)

92

Ich verwende gerne Fragezeichen am Ende von Methoden- / Funktionsnamen in anderen Sprachen. Java lässt mich das nicht tun. Wie kann ich als Problemumgehung boolesche Rückgabemethoden in Java benennen? Mit Hilfe eines is, has, should, canin der vor einem Verfahren Sound in Ordnung für einige Fälle. Gibt es eine bessere Möglichkeit, solche Methoden zu benennen?

Zum Beispiel createFreshSnapshot?

letronje
quelle
2
Welche Sprache erlaubt ?einen Methodennamen?
SLaks
11
@ Slaks, Schema, Ruby ...
Skilldrick
Im Schema setzen wir immer ein pam Ende des Methodennamens
Erick Robertson
@Erick: nicht immer, aber "p" ist eine Standardmethode zur Bezeichnung von Prädikaten
Jason S
wir = meine Grundschulklasse hat es immer getan. Ich würde diese Konvention niemals in Java verwenden.
Erick Robertson

Antworten:

119

Die Konvention besteht darin, eine Frage im Namen zu stellen.

Hier einige Beispiele, die im JDK zu finden sind:

isEmpty()

hasChildren()

Auf diese Weise werden die Namen so gelesen, als hätten sie am Ende ein Fragezeichen.

Ist die Sammlung leer?
Hat dieser Knoten Kinder?

Und truebedeutet dann ja und falsebedeutet nein.

Oder Sie könnten es wie eine Behauptung lesen:

Die Sammlung ist leer.
Der Knoten hat Kinder

Hinweis:
Manchmal möchten Sie eine Methode wie folgt benennen createFreshSnapshot?. Ohne das Fragezeichen impliziert der Name, dass die Methode einen Snapshot erstellen sollte, anstatt zu prüfen, ob einer erforderlich ist.

In diesem Fall sollten Sie überdenken, was Sie tatsächlich fragen. So etwas isSnapshotExpiredist ein viel besserer Name und vermittelt, was die Methode Ihnen sagt, wenn sie aufgerufen wird. Das Befolgen eines solchen Musters kann auch dazu beitragen, dass mehr Funktionen rein und ohne Nebenwirkungen bleiben.

Wenn Sie ein tun Google - Suche nach isEmpty()in der Java - API, erhalten Sie viele Ergebnisse.

jjnguy
quelle
Was ist mit createFreshSnapshot?
Letronje
4
@letr, na ja, ich würde es wahrscheinlich lit isSnapshotExpiredoder so ähnlich umbenennen . (basierend auf Ihren Kriterien)
jjnguy
8
Ich komme um das Problem 'createFrshSnapshot' herum, indem ich das Wort 'should' verwende - dh "shouldCreateFreshSnapshot ()" (obwohl in diesem Fall isSnapshotExpired () besser ist)
DJClayworth
1
Ich überprüfe, ob Heartbeat-Nachrichten mit einer shouldHeartbeat()Methode gesendet werden sollen .
Erick Robertson
Warum denken Sie das isEmpty()und hasChildren()sind Fragen und keine Behauptungen ? Auf Englisch liest es sich tatsächlich etwas besser, wenn Sie sich diese Namen als Behauptungen oder Prädikate vorstellen.
Rick
29

Wenn Sie möchten, dass Ihre Klasse mit der Java Beans-Spezifikation kompatibel ist , damit Tools, die Reflection verwenden (z. B. JavaBuilders , JGoodies Binding ), boolesche Getter erkennen können, verwenden Sie entweder getXXXX()oder isXXXX()als Methodennamen. Aus der Java Beans-Spezifikation:

8.3.2 Boolesche Eigenschaften

Darüber hinaus erlauben wir für boolesche Eigenschaften eine Getter-Methode, die dem Muster entspricht:

public boolean is< Eigenschaftsname > ();

Dieses „ist < Propertyname >“ Methode anstelle einer „get < zur Verfügung gestellt werden kann Property >“ Methode, oder es kann zusätzlich zu einem „get <bereitgestellt wird Property >“ -Methode. In beiden Fällen verwenden wir die Methode "is < Eigenschaftsname >", um den Eigenschaftswert zu lesen , wenn für eine boolesche Eigenschaft die Methode "is < Eigenschaftsname >" vorhanden ist . Eine beispielhafte boolesche Eigenschaft könnte sein:

public boolean isMarsupial();
public void setMarsupial(boolean m);
Jason S.
quelle
Es ist verwirrend, wenn Sie sagen, public boolean is<PropertyName>(); es sieht aus wie ein Generikum.
Erick Robertson
Hey, ich zitiere nur die Spezifikation. Ich werde gemäß der Spezifikation kursiv schreiben.
Jason S
4
Die Kompatibilität mit Java-Beans ist mir egal, ich möchte nur, dass meine Methodennamen richtig klingen :)
letronje
4
Auch wenn Sie sich nicht für die Kompatibilität mit Javabeans interessieren, lohnt es sich, die Namenskonvention zu befolgen, da sie weit über den ursprünglichen Umfang der in IDEs konfigurierten 'Beans' hinaus gewachsen ist. Wenn Sie beispielsweise isEmpty als Methodennamen verwenden, können Sie diese Methode über JSP mit object.empty aufrufen. Sie können jedoch keine Methoden mit anderen Präfixen aufrufen, sodass Sie object.children nicht zum Aufrufen von object.hasChildren () verwenden können. Mit JSP und EL (Expression Language) können Sie also auf Javabeans-Eigenschaften zugreifen. Ein großer Gewinn, wenn Sie mich fragen.
Stijn de Witt
JavaBeans ist sehr spezifisch, danke, dass Sie daran erinnert haben. Ich frage mich oft und neige dazu zu denken, dass ich mit dem Präfix 'ist' festgefahren bin, aber in der Tat überhaupt nicht.
Snicolas
26

Ich möchte diesen Link veröffentlichen, da er für Peeps, die diese Antwort überprüfen und nach mehr Konventionen im Java-Stil suchen, hilfreich sein kann

Richtlinien für den Java-Programmierstil

Punkt "2.13 ist Präfix sollte für boolesche Variablen und Methoden verwendet werden." ist spezifisch relevant und schlägt das Präfix is vor .

Der Styleguide schlägt vor:

Es gibt einige Alternativen zum Präfix is , die in bestimmten Situationen besser passen. Diese Präfixe haben , können und sollten :

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

Wenn Sie die Richtlinien befolgen, wird meiner Meinung nach die geeignete Methode genannt:

shouldCreateFreshSnapshot()
kommradHomer
quelle
2
Zu Ihrer Information, es gibt Richtlinien, die dem Urheberrecht von Geotechnical Software Services unterliegen. Das heißt, sie haben die Quelle unten angegeben, um darauf hinzuweisen, dass sie legitim sind.
Donal Lafferty
11

Für Methoden, die möglicherweise fehlschlagen, dh Sie geben Booleschen Wert als Rückgabetyp an, würde ich das Präfix verwenden try:

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

Verwenden Sie für alle anderen Fälle Präfixe wie is.. has.. was.. can.. allows....

Codymanix
quelle
15
Aber try vermittelt nicht, dass es sich um eine Frage handelt (hat einen Rückgabewert).
Steve Kuo
Geben Sie niemals einen Booleschen Wert zurück, um anzugeben, ob eine Methode fehlgeschlagen ist oder nicht. Wenn die Methode fehlgeschlagen ist, lösen Sie eine Ausnahme aus. Stellen Sie sich vor, die Methode ist fehlgeschlagen und Sie erhalten eine falsche. Wie würden Sie feststellen, was genau schief gelaufen ist?
Wouter van Koppen
5

Standard ist die Verwendung von 'ist' oder 'hat' als Präfix. Zum Beispiel isValid, hasChildren.

BillThor
quelle
2

isist der, dem ich mehr als jeder andere begegnet bin. Was auch immer in der aktuellen Situation Sinn macht, ist die beste Option.

Skilldrick
quelle
-1

Ich möchte eine andere Sicht auf diese allgemeine Namenskonvention zeigen, z.

Set :boolean add​(E e)

wo die Begründung ist:

Führen Sie eine Verarbeitung durch und melden Sie dann , ob dies erfolgreich war oder nicht .

Während der Name in der returnTat ein booleanName der Methode ist, sollte die Verarbeitung anstelle des Ergebnistyps (in diesem Beispiel boolesch) abgeschlossen sein.

Ihr createFreshSnapshotBeispiel scheint für mich eher mit dieser Sichtweise verbunden zu sein, da dies Folgendes zu bedeuten scheint: Erstellen Sie einen neuen Schnappschuss und berichten Sie dann, ob die Erstellungsoperation erfolgreich war. In Anbetracht dieser Argumentation createFreshSnapshotscheint der Name die beste für Ihre Situation zu sein.

adrhc
quelle