Boolesches Feld benennen, das ein Verb ist


13

In Java werden standardmäßig Getter und Setter für Boolesche Felder isField()und verwendet setField(). Das funktioniert völlig in Ordnung , mit Feldnamen , die Adjektive wie active, visible, closedusw.

Aber wie kann ich ein Feld benennen, das die Bedeutung eines Verbs hat haveChildren? Fügen Sie dem Verb ( ) "_ing" hinzu , vielleicht?havingChildren

Zur Verdeutlichung habe ich keine Kontrolle über die Methodennamen (Getter und Setter), da diese von der IDE automatisch generiert werden. Also, was ich brauche, ist ein passender Feldname, damit es Sinn ergibt, wenn die IDE einen Getter dafür generiert. hasChildrenEin perfekter Feldname ist beispielsweise, aber wenn die IDE den Getter für das Feld generiert, ist dies der Fall isHasChildren. Wie löse ich das?


3
Wenn dies ein Bool-Feld ist, parentwürde es funktionieren.
Yannis

2
Wenn Sie mit der Umkehrung der Bedeutung davonkommen können, wäre 'kinderlos' der Trick.
Kilian Foth

3
Scheint albern, den Namen eines Feldes durchzuspringen, um ein durch die IDE verursachtes grammatikalisches Problem zu vermeiden. Unabhängig davon, hier sind einige zusätzliche Vorschläge, obwohl ich denke, dass die bereits von anderen gegebenen besser sind: isAllowedChildren, isNotEmpty, isContainer, isLeaf,
Dr. Wily's Apprentice

Kinderlos scheint der richtige Weg zu sein. Das Problem mit dem übergeordneten Objekt ist, dass ich bereits ein übergeordnetes Feld für den Verweis auf das übergeordnete Objekt habe. Ich denke, was ich brauche, ist eine allgemeine Regel, um alle Verben in Adjektive für boolesche Felder umzuwandeln.
Dienstag,

1
Ich bin mit @dnhang einverstanden, dass eine IDE solche Dinge nicht vorschreibt. Die Auswahl von Variablen- und Methodennamen ist wichtig, um den Code lesbar zu machen. Die IDE, in der er geschrieben ist, sollte irrelevant sein.
Digitalex

Antworten:


10

Kurze Antwort:

  • Methodennamen werden nicht übernommen, um die interne Implementierung, sondern das erwartete Verhalten widerzuspiegeln.

Lange Antwort:

haveChildren()sollte benannt werden hasChildren().

Ich sehe es auch nicht hasChildren()als notwendig an, der Getter für ein Mitglied der Booleschen Klasse zu sein. Ich schätze, eine solche Methode würde herausfinden, ob ein Mitglied vom Typ Collectionleer ist oder nicht .

Der Standardname, den eine IDE für generierte Getter und Setter verwendet, ist kein in Stein gemeißeltes Gesetz.

Ein weiterer Punkt: Schnittstellen haben Namen für noch zu implementierende Methoden.

Wenn Methodennamen verwendet würden, um die interne Implementierung widerzuspiegeln, wie könnte jemand jemals eine Schnittstelle entwerfen? Schnittstellen haben weder eine Implementierung, noch wissen sie vorher, was die Implementierer unter der Haube tun werden.

Nehmen wir zum Beispiel die IteratorOberfläche in Java.

IteratorSelbst wenn Sie ein boolesches Mitglied namens implementieren , müssen nextSie es nicht hasNext()in isNext()oder umbenennen isHavingNext(). Das ist ein Implementierungsdetail. Tatsächlich habe ich implementiert, Iteratorund was ich tue, ist, ein Mitglied des Typs zu haben, von dem meine Klasse eine Liste mit dem Namen hat next(kein Boolescher Wert ). hasNext()dann kehrt zurück next!=null.

Siehe dazu auch:

class patient {
      private boolean pulse;
      private boolean breaths:
      public boolean isDead(){ return (!pulse & !breaths);}
}

Beachten Sie, dass dies isDead()kein normaler Getter ist.

Nutzen Sie die Produktivitätstools von IDEs für das, was sie sind.


3

Ich würde vorschlagen, das Feld in parentumzubenennen , damit der Getter isParentund der Setter sein werden setParent.

Sie können auch childPresentnach dem Variablennamen und isChildPresentund setChildPresentals Getter und Setter suchen .


1
Dieselbe Idee wie Yannis 'Kommentar oben, aber das Problem ist, dass ich bereits ein parentFeld habe, in dem der Verweis auf das übergeordnete Objekt gespeichert werden kann. Ich denke, was ich brauche, ist eine allgemeine Regel, um alle Verben in Adjektive für boolesche Felder umzuwandeln.
Dienstag,

0

Sie könnten doesvor dem Verb setzen. Wie doesHaveChildrenin Ihrem Beispiel, das Sie angegeben haben. Oder vielleicht shouldHaveChildrenabhängig vom Kontext.


1
Das Problem ist, dass ich keine Kontrolle über den Methodennamen habe, da der Getter und der Setter automatisch von der IDE generiert werden (z. B. Eclipse).
Dienstag,

1
Benennen Sie einfach die Methode (n) um? Fügen Sie eine Tastenkombination hinzu, um Methoden umzubenennen (falls Sie noch keine haben).
Miguel.Martin

@dnhang Wenn es sich um Ihren Code handelt, können Sie die Methoden beliebig aufrufen, unabhängig davon, wie die IDE sie beim automatischen Generieren aufruft.
Richard

1
@ miguel.martin Ein Grund, warum Sie dies nicht möchten, sind Java-Beans. Die Annahme von isSomethingist ein Teil dieser Spezifikation, und es werden viele Annahmen getroffen, die dem Guten oder Schlechten entgegenwirken und die doesSomethingDinge auf nicht so offensichtliche Weise brechen und zu Fehlern führen.

0

Die Frage ist völlig vernünftig. Manchmal reicht es nicht aus, die automatisch generierte Methode umzubenennen. Beispiel: Von JSF-verwalteten Beans wird erwartet, dass sie isXyz()die Getter-Methode einer boolean xyzEigenschaft haben.

Ich stimme BlackPanther zu, der vorschlägt, das Feld in umzubenennen parentund isParentals Methodennamen zu verwenden. Gemäß dem Prinzip des Ausblenden von Informationen ist die Lesbarkeit der Get- und Setter-Methoden wichtiger als die der Attribute.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.