Denominazione del campo booleano che è un verbo


14

In Java, per convenzione getter e setter per i campi booleani saranno isField()e setField(). Questo funziona perfettamente bene con i nomi dei campi che sono aggettivi come active, visible, closed, etc.

Ma come posso nominare un campo che ha significato di un verbo, come haveChildren? Aggiungi "_ing" al verbo ( ), forse?havingChildren

Per chiarire, non ho il controllo dei nomi dei metodi (getter e setter) in quanto sono generati automaticamente dall'IDE. Quindi quello di cui ho bisogno è un nome di campo appropriato in modo che quando l'IDE genera un getter per esso, abbia senso. Ad esempio, hasChildrenè un nome di campo perfetto, ma quando l'IDE genera il getter per il campo lo sarebbe isHasChildren. Come lo risolvo?


3
Se questo è un campo bool, parentfunzionerebbe.
yannis,

2
Se riesci a scartare il significato, "senza figli" sarebbe il trucco.
Kilian Foth,

3
Sembra un po 'sciocco dover saltare attraverso i cerchi per quanto riguarda il nome di un campo per evitare un problema grammaticale causato dall'IDE. Indipendentemente da ciò, ecco alcuni suggerimenti aggiuntivi, anche se penso che quelli già forniti da altri siano migliori: isAllowedChildren, isNotEmpty, isContainer, isLeaf,
Dr. Wily's Apprentice

senza figli sembra essere la strada da percorrere. Il problema con parent è che ho già un campo parent per contenere il riferimento all'oggetto parent. Penso che ciò di cui ho bisogno sia una regola generale per convertire tutti i verbi in aggettivi per campi booleani.
Dal

1
Sono d'accordo con @dnhang che non dovresti lasciare che un IDE imponga cose come questa. La scelta dei nomi delle variabili e dei metodi è importante per rendere leggibile il codice, quale IDE in cui è scritto dovrebbe essere irrilevante.
Digitalex,

Risposte:


11

Risposta breve:

  • i nomi dei metodi non vengono sostituiti per riflettere l'implementazione interna ma il comportamento previsto.

Risposta lunga:

haveChildren()dovrebbe essere chiamato hasChildren().

Inoltre, non vedo hasChildren()necessariamente essere il getter per un membro della classe booleana. Immagino che un tale metodo scoprirebbe se un membro di tipo Collectionè vuoto.

Il nome predefinito assegnato da un IDE ai getter e ai setter generati non è considerato una legge impostata su pietra.

Un altro punto: le interfacce hanno nomi per i metodi ancora da implementare.

Se i nomi dei metodi fossero sostituiti per riflettere l'implementazione interna, come si potrebbe mai progettare un'interfaccia? Le interfacce non hanno un'implementazione né sanno in anticipo cosa faranno gli implementatori sotto il cofano.

Prendiamo ad esempio l' Iteratorinterfaccia in Java.

Quando si implementa Iterator, anche quando si dispone di un membro booleano denominato next, non si è autorizzati a rinominare hasNext()in isNext()o isHavingNext(). Questo è un dettaglio di implementazione. In effetti, ho implementato Iteratore quello che faccio è avere un membro del tipo di ciò che la mia classe ha un elenco di, chiamato next(non un booleano). hasNext()quindi ritorna next!=null.

Inoltre, vedi questo:

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

Si noti che isDead()non è un normale getter.

Prendi gli strumenti di produttività degli IDE per quello che sono.


3

Suggerirei di rinominare il campo in parentmodo che il getter sia isParente il setter sarà setParent.

Puoi anche provare childPresentper il nome della variabile isChildPresente setChildPresentcome getter e setter.


1
Stessa idea del commento di Yannis sopra, ma il problema è che ho già un parentcampo per contenere il riferimento all'oggetto genitore. Penso che ciò di cui ho bisogno sia una regola generale per convertire tutti i verbi in aggettivi per campi booleani.
Dal

0

Potresti mettere doesdavanti al verbo. Come doesHaveChildrennel tuo esempio che hai fornito. O forse a shouldHaveChildrenseconda del contesto.


1
Il problema è che non ho il controllo del nome del metodo perché getter e setter sono generati automaticamente dall'IDE (ad esempio Eclipse).
Dal

1
Rinominare il / i metodo / i? Aggiungi un keybind per rinominare i metodi (se non ne hai già uno).
miguel.martin,

@dnhang se è il tuo codice, puoi chiamare i metodi come preferisci, indipendentemente da come li chiama l'IDE quando si genera automaticamente.
Richard,

1
@ miguel.martin Uno dei motivi per cui non vorresti farlo è Java-bean. L'assunzione di isSomethingè una parte di quella specifica e molte ipotesi sono fatte intorno ad essa, nel bene e nel male, andare contro questo con doesSomethinguna volontà che spezzerà le cose in modi non così ovvi, portando a bug.

0

La domanda è perfettamente ragionevole. A volte non è sufficiente rinominare il metodo generato automaticamente. Esempio: si prevede che i bean gestiti JSF abbiano isXyz()come metodo getter di una boolean xyzproprietà.

Sono d'accordo con BlackPanther che suggerisce di rinominare il campo parente utilizzarlo isParentcome nome del metodo. Secondo il principio di occultamento delle informazioni, la leggibilità dei metodi getter e setter è più importante di quella dell'attributo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.