Convenzioni di denominazione per metodi java che restituiscono booleano (nessun punto interrogativo)


93

Mi piace usare il punto interrogativo alla fine dei nomi di metodi / funzioni in altre lingue. Java non mi permette di farlo. Come soluzione alternativa, in quale altro modo posso denominare metodi di restituzione booleani in Java? L'utilizzo di un is, has, should, cannella parte anteriore di un suono metodo va bene per alcuni casi. C'è un modo migliore per nominare tali metodi?

Ad esempio, createFreshSnapshot?


2
Quale lingua consente un ?nome in un metodo?
SLaks

11
@SLaks, Scheme, Ruby ...
Skilldrick

nello schema, mettiamo sempre una palla fine del nome del metodo
Erick Robertson

@Erick: non sempre, ma "p" è un modo standard per designare predicati
Jason S

noi = il mio corso universitario lo faceva sempre. Non userei mai questa convenzione in Java.
Erick Robertson

Risposte:


121

La convenzione è fare una domanda nel nome.

Ecco alcuni esempi che possono essere trovati nel JDK:

isEmpty()

hasChildren()

In questo modo, i nomi vengono letti come se avessero un punto interrogativo alla fine.

La raccolta è vuota?
Questo nodo ha figli?

E, quindi, truesignifica sì e falsesignifica no.

Oppure potresti leggerlo come un'affermazione:

La raccolta è vuota.
Il nodo ha figli

Nota: a
volte potresti voler nominare un metodo qualcosa come createFreshSnapshot?. Senza il punto interrogativo, il nome implica che il metodo dovrebbe creare un'istantanea, invece di verificare se è necessaria.

In questo caso dovresti ripensare a ciò che stai effettivamente chiedendo. Qualcosa di simile isSnapshotExpiredè un nome molto migliore e trasmette ciò che il metodo ti dirà quando viene chiamato. Seguire uno schema come questo può anche aiutare a mantenere più pure le tue funzioni e senza effetti collaterali.

Se fate una ricerca di Google per isEmpty()la Java API, si ottiene un sacco di risultati.


che dire di createFreshSnapshot?
letronje

4
@letr, beh, probabilmente lo rinominerei illuminato isSnapshotExpiredo qualcosa del genere. (in base ai tuoi criteri)
jjnguy

8
Ho aggirato il problema 'createFrshSnapshot' usando la parola 'should' - cioè "shouldCreateFreshSnapshot ()" (anche se in questo caso isSnapshotExpired () è meglio)
DJClayworth

1
Controllo per vedere se i messaggi heartbeat devono essere inviati con un shouldHeartbeat()metodo.
Erick Robertson

Perché pensarlo isEmpty()e hasChildren()sono domande e non affermazioni ? In realtà si legge leggermente meglio in inglese se si considerano quei nomi come affermazioni o predicati.
Rick

29

Se desideri che la tua classe sia compatibile con la specifica Java Beans , in modo che gli strumenti che utilizzano la reflection (ad esempio JavaBuilders , JGoodies Binding ) possano riconoscere i getter booleani, utilizzare getXXXX()o isXXXX()come nome del metodo. Dalle specifiche Java Beans:

8.3.2 Proprietà booleane

Inoltre, per le proprietà booleane, consentiamo a un metodo getter di abbinare il modello:

public boolean is< PropertyName > ();

Questo metodo "is < PropertyName >" può essere fornito invece di un metodo "get < PropertyName >", oppure può essere fornito in aggiunta a un metodo "get < PropertyName >". In entrambi i casi, se il metodo "is < PropertyName >" è presente per una proprietà booleana, utilizzeremo il metodo "is < PropertyName >" per leggere il valore della proprietà. Una proprietà booleana di esempio potrebbe essere:

public boolean isMarsupial();
public void setMarsupial(boolean m);

È fonte di confusione quando dici che public boolean is<PropertyName>(); sembra un generico.
Erick Robertson

Ehi, sto solo citando le specifiche. Scriverò in corsivo secondo le specifiche.
Jason S

4
Non mi interessa la compatibilità dei Java Beans, voglio solo che i nomi dei miei metodi
suonino

4
Anche se non ti interessa la compatibilità Javabeans, vale la pena seguire la convenzione di denominazione, perché è cresciuta ben oltre lo scopo originario dei "bean" configurati negli IDE. Ad esempio, se si utilizza isEmpty come nome del metodo, è possibile chiamare questo metodo da JSP utilizzando object.empty, tuttavia non è possibile chiamare metodi con altri prefissi, quindi non è possibile utilizzare object.children per chiamare object.hasChildren (). Quindi JSP e EL (Expression Language) ti consentono di accedere alle proprietà Javabeans. Una grande vittoria se me lo chiedi.
Stijn de Witt

JavaBeans è molto specifico, grazie per averlo ricordato. Spesso mi chiedo e tendo a pensare di essere bloccato con il prefisso "è", ma non è affatto vero.
Snicolas

26

Voglio pubblicare questo collegamento in quanto può aiutare ulteriormente per i peep che controllano questa risposta e cercano più convenzioni in stile java

Linee guida sullo stile di programmazione Java

L'elemento "2.13 è prefisso deve essere utilizzato per variabili e metodi booleani". è specificamente rilevante e suggerisce il prefisso is .

La guida allo stile prosegue suggerendo:

Ci sono alcune alternative al prefisso is che si adatta meglio in alcune situazioni. Questi sono prefissi has , can e should :

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

Se segui le linee guida, credo che il metodo appropriato verrebbe chiamato:

shouldCreateFreshSnapshot()

2
Cordiali saluti, le linee guida sono copyright Geotechnical Software Services. Detto questo, hanno fatto riferimento alla fonte in fondo per suggerire che sono legittimi.
Donal Lafferty

11

Per i metodi che potrebbero non riuscire, ovvero specificare booleano come tipo di ritorno, utilizzerei il prefisso try:

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

Per tutti gli altri casi, utilizza prefissi come is.. has.. was.. can.. allows....


15
Ma try non trasmette che è una domanda (ha un valore di ritorno).
Steve Kuo

Non restituire mai un valore booleano per indicare se un metodo non è riuscito o meno. Se il metodo non è riuscito, genera un'eccezione. Immagina che il metodo fallisca e ottieni un falso, come determineresti cosa è andato storto esattamente?
Wouter van Koppen

5

Lo standard è utilizzare "è" o "ha" come prefisso. Per esempio isValid, hasChildren.


2

isè quello che ho incontrato più di ogni altro. Tuttavia, qualunque cosa abbia senso nella situazione attuale è l'opzione migliore.


0

Voglio puntare una visione diversa su questa convenzione di denominazione generale , ad esempio:

vedi java.util.Set :boolean add​(E e)

dove la logica è:

eseguire alcune elaborazioni, quindi segnalare se è riuscita o meno .

Sebbene returnsia effettivamente un booleanil nome del metodo dovrebbe indicare l'elaborazione da completare invece del tipo di risultato (booleano per questo esempio).

Il tuo createFreshSnapshotesempio mi sembra più correlato a questo punto di vista perché sembra significare questo: crea una nuova istantanea, quindi segnala se l'operazione di creazione è riuscita. Considerando questo ragionamento il nome createFreshSnapshotsembra essere il migliore per la tua situazione.


1
Non sono sicuro del motivo per cui sei stato svalutato, sono d'accordo. Anche se evito di usarlo, perché non è affatto semantico, è una convenzione usata da molte API Java interne.
Kamil Bęben

1
Immagino perché inizialmente ho scritto solo "Set: boolean add (E e)" quindi la gente non si è accorta che si tratta del ben noto java.util.Set; o forse perché il mio inglese è così pessimo: D. Grazie per il
voto positivo
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.