Getter booleani Java "è" vs "sono"


90

So che la convenzione in Java per i getter booleani è di includere il prefisso "è".

isEnabled
isStoreOpen

Ma cosa succede se il soggetto è plurale? Cioè, e se invece di voler sapere se un negozio è aperto, volessi sapere se tutti i negozi sono aperti?

isStoresOpen() non ha senso in inglese.

Sono tentato di scrivere getter come:

areStoresOpen
areDogsCute
areCatsFuzzy

E penso che avrebbe senso, ma mi è stato detto da altri che dovrei solo aspirare e abbandonare soggetto, verbo accordo e l'utilizzo isStoresOpen, isDogsCute, isCatsFuzzy.

Comunque, cosa devo fare per i getter booleani che operano su un soggetto plurale?


3
Non ho mai visto prima un are*()getter.
rekire

21
Scrivo sempre are*()getter se sono grammaticalmente corretti.
Roddy of the Frozen Peas

2
Se il tuo oggetto è un fagiolo, penso che devi attenersi a uno iso has...
assylias

4
se stai usando are * () getter, nella maggior parte dei casi dovrebbe restituire boolean [], credo.
Juvanis

2
Domanda molto buona. Me lo sono chiesto io stesso, un bel po '. Come molte delle risposte hanno già sottolineato, la maggior parte dei framework, IDE e tutto ciò che si basa su una convenzione che ho incontrato usa il modello "get" / "set" / "is". Anche se questo non è un problema nella tua applicazione, seguirei quella convenzione a prescindere: il tuo codice sarà molto più facile da seguire (anche da te) se mantieni una convenzione di denominazione coerente (anche se a volte non suona grammaticalmente strano ).
Paul Richter

Risposte:


57

Non ricordo da quale libro provenisse, ma l'essenza è che il codice verrà letto molte più volte di quanto non sia scritto. Scrivi per leggibilità.


20
Clean Code - Robert Martin
John B

8
Ma stai molto attento a non andare troppo lontano. storesAreOpen()probabilmente sarebbe il più grammaticale (a causa di if(storesAreOpen())), ma la parte booleana del nome è ora nascosta nel mezzo del nome del metodo, il che infrange le convenzioni Java e il codice leggibile.
Izkata

108
Non capisco come questa sia la risposta accettata. Non fornisce nemmeno una risposta definitiva alla domanda.
Tamzin Blake

3
Risponde alla domanda in modo molto generale. È vero che non affronta i dettagli, ma questa è una risposta. Può sembrare banale, ma ha un valore (almeno 24 persone la pensano così).
George Stocker

4
per chiarire la risposta aggiungerei un'osservazione che areStoresOpen () è una buona scelta qui.
kiedysktos

94

Che ne dici di avere un inglese abbastanza decente e seguire lo standard Java:

isEveryStoreOpen() o isEachCatCute()

Quando ho dei dubbi sulla parola giusta, mi piace sempre cercare il thesaurus.


18
+1, questo indica chiaramente se il valore restituito significa isEveryStoreOpen () o isAnyStoreOpen () a differenza dell'ambiguo isStoresOpen ().
Imre

4
+1 Questa dovrebbe essere la risposta accettata! Ha senso grammaticalmente mantenendo il Java booleans isconvenzione prefisso. Inoltre, fornisce un po 'di informazioni extra che saranno davvero utili per quei madrelingua inglesi che sono i manutentori della base di codice.
higuaro

Questa risposta ha cambiato la mia vita! E dovrebbe essere la risposta accettata.
Marcel Blanck

34

La convenzione è di anteporre al metodo getter "is" e non il variale stesso.

per esempio

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

e

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () non ha senso in inglese.

Potrebbe non avere senso grammaticalmente, ma segue la convenzione e sembra abbastanza leggibile.


La tua risposta ha senso e lo apprezzo. Penso che da una posizione autorevole giusto / sbagliato tu abbia ragione. È solo che non voglio una convenzione che abbia lo scopo di aiutarci essendo ovvio, chiaro e di facile comprensione per abbandonare quello scopo per il bene di aderire alle sue regole. Ma hai ragione: è così, ed è quello che ho chiesto.
kodai

@kodai: penso che non dovrebbe essere considerato come regola, ma solo una convenzione. Ma credo che scrivere codice non seguendo la convenzione, se non è richiesto, per rendere il codice leggibile sia la strada da percorrere.
Bhesh Gurung

18

La specifica Java Bean dice di usare getper i getter a meno che non sia un booleanuso successivo is. arenon è standard e non verrà riconosciuto da tutto ciò che prevede una denominazione Bean standard.


17

Molti strumenti si aspettano iso getprobabilmente non riconosceranno are.

Prova a riformularli, come getDogsAreFuzzy()o getStoresAreOpen()o cose del genere per una migliore compatibilità e convenzioni.


Sì. Strumenti come i bean utilities contano sulla parola è trovare getter booleani.
nalply

4

- isEnabled() può anche essere scritto come getEnabled()in Java naming conventions.

- È solo una buona abitudine seguire le convenzioni di denominazione, aiutare quando si lavora con Java Beans.


3

In generale, penso che il codice dovrebbe essere il più facilmente leggibile possibile in modo che un metodo possa quasi essere letto come un paragrafo (come sposato da Clean Code). Pertanto, nominerei il metodo per suonare / leggere il più facilmente possibile e seguire la regola grammaticale di are. Con gli IDE moderni è facile trovare metodi senza cercare specificamente get/ is.

Tuttavia, Kumar fa un buon punto sui fagioli. Molti strumenti cercheranno solo get/ is. In tal caso potrei considerare di avere entrambi i metodi. Uno per facilitare la lettura e uno per l'uso degli strumenti.


3

In che lingua scrivi: inglese o Java ?

Quando leggo il codice Java, mi aspetto che le cose siano lì, farmi cercare entrambi i getter, con i prefissi is e are , sarà più complicato della ricerca di un solo prefisso.

Tuttavia, d'altra parte, quando leggo il giornale al mattino, non cerco nulla, quindi puoi scrivere in un modo più tradizionale dell'inglese.

return 0;


3

Nella tua domanda stai chiedendo esplicitamente di getter. Un getter restituisce alcune informazioni su un'istanza della tua classe. Ad esempio, hai una classe Store. Ora, isStoreOpenè un nome di metodo perfetto per un getter.

Successivamente, menzioni un metodo che controlla se tutti i negozi sono aperti. Questo metodo non è affatto un getter, perché non restituisce informazioni su un'istanza ma per tutte. Ovviamente a meno che non ci sia una classe Stores. Se questo è il caso, dovresti ripensare al tuo progetto, perché Java ha già modi per memorizzare un numero di istanze, ad esempio array o collezioni, quindi non devi scrivere classi extra.

In caso contrario, il nome di questo metodo va benissimo. Un'alternativa potrebbe essere solo allStoresOpensenza "è".

TL; DR: se hai a che fare con più istanze, non è un getter. Se lo è, il tuo design è cattivo.


2

Onestamente, direi assolutamente dimenticati di are*e resta con is*. Pensa al "is"significato della variabile e crea un nome migliore, se possibile.

Direi che isStoresOpen non suona così male, ma puoi creare isStoresAreOpen se suona meglio per te.

Ma la mia idea generale sarebbe quella di attenermi alle convenzioni. Che sta usando "get" per getter e "is" per i tipi booleani. Personalmente penso che usare "è" a volte sia già problematico. Sì - sembra buono in condizioni "if", ma a volte scrivo semplicemente "get" durante la codifica e controllo l'elenco a discesa per la variabile necessaria e inizio a chiedermi cosa c'è che non va e perché non riesco a trovarlo, poi me ne rendo conto inizia con "è" ...


1

Nella programmazione orientata agli oggetti, questo dovrebbe accadere raramente, se non mai, poiché Storeo Cato cosa hai dovresti essere una classe separata, con il proprio isOpen()o isFuzzy()metodo. Se hai un tipo più alto, valuta la possibilità di suddividerlo al livello più atomico che stai effettivamente utilizzando. In generale, gli oggetti non dovrebbero essere plurali al livello più basso.


1

isStoresOpen () in questo StoresOpen sembra un plurale,

Quando segui la Java Naming Convention e gli Java Beans Standard, hanno prefissi predefiniti per booleano e altro tipo, quindi dovresti seguire Java Beans Naming Convention.

Veniamo al tuo punto Quando vedi negozi aperti come in una prospettiva inglese, sì, sembra al plurale. Ancora una volta prendi una profonda osservazione in quella parola,

Qui

storesOpen è plurale secondo la grammatica inglese,

Il risultato di isStoresOpen non è plurale, invece è singolare o si può dire che è scalare in termini di convenzione di programmazione.

È venuto fuori che è booleano, vero o falso

Non come la tua dichiarazione plurale inglese vero o falso

Non una matrice di vero o falso , o non una raccolta di vero o falso

Quindi, qui possiamo dire che, qui ci occupiamo del valore restituito da quel metodo booleano del bean, non del nome dato alla proprietà della classe per indicare l'entità del mondo reale.

Un'altra cosa importante è che, ogni volta che tali proprietà booleane vengono utilizzate nelle classi e quelle vengono utilizzate da librerie predefinite in qualsiasi framework, il framework con prefisso use ' is ' per il recupero di valori booleani,

perché significa che non è molto più intelligente di te dato che conosci la grammatica inglese come plurale / singolare, multiplexer ecc ...

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.