Leggibilità dei nomi dei metodi booleani


120

Domanda semplice, dal punto di vista della leggibilità, quale nome di metodo preferisci per un metodo booleano:

public boolean isUserExist(...)

o:

public boolean doesUserExist(...)

o:

public boolean userExists(...)

21
il primo suona comeisBabbyFormed

Dipende dalla lingua. Lingue diverse hanno convenzioni diverse; Mi vengono in mente Java e Objective C. Anche soggettivo borderline.
Jed Smith,

Soggettivo - abbastanza giusto
Yuval Adam

2
Puramente soggettivo. getUserExistence, userIsNotExtinct, userHasExistentialStateEcc ...
dreamlax

Sartre sarebbe orgoglioso
Cornel Masson

Risposte:


112
public boolean userExists(...)

Sarebbe il mio preferito. Poiché rende i tuoi controlli condizionali molto più simili all'inglese naturale:

if userExists ...

Ma immagino che non ci sia una regola rigida e veloce: sii coerente


3
"rende la tua {chiamata al metodo} molto più simile all'inglese naturale" suona come un ottimo test per la denominazione razionale su tutta la linea. ha chiarito il mio pensiero in merito - grazie!
cori

16
D'altra parte, isolatamente o quando non segue immediatamente "if", "userExists ()" suona come un'affermazione di fatto, piuttosto che come la domanda a cui era destinato. A differenza di "IsUserExisting ()" o "DoesUserExist ()", che segue le regole dell'ordine delle parole in lingua naturale inglese per domande dirette.
Oskar Berggren

4
..ma perché i metodi che restituiscono un bool dovrebbero essere usati al di fuori di un if? Se hanno effetti collaterali, è ancora più un odore. if IsUserExisting()e if DoesUserExist()sembra orrendo e dovrebbe essere evitato.
RJFalconer

@RJFalconer a volte potrebbe essere necessario utilizzare il risultato di quel metodo in diversi punti, quindi lo assegnerai a variabile. Dato che viene chiamato il metodo userExists, quale nome della variabile dichiarerai? userExistsva bene per le variabili, non per i metodi. Come ha scritto @Oskar, suona come un'affermazione, non una domanda.
Jarosław Wlazło

Per situazioni in cui devono essere presenti un soggetto, un predicato e un oggetto, ad esempio UserSessionIsComplete o IsUserSessionComplete, quale preferisci?
Yang

40

Direi userExists, perché il 90% delle volte il mio codice chiamante sarà simile a questo:

if userExists(...) {
  ...
}

e si legge molto letteralmente in inglese.

if isUserExiste if doesUserExistsembrano ridondanti.


18

Attenzione a sacrificare la chiarezza mentre si insegue la leggibilità .

Anche se if (user.ExistsInDatabase(db))legge più bene di if (user.CheckExistsInDatabase(db)), considera il caso di una classe con un modello di generatore (o qualsiasi classe su cui puoi impostare lo stato):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Non è chiaro se ExistsInDatabasesta controllando se esiste o se sta impostando il fatto che esiste. Non scriveresti if (user.Age())o if (user.Name())senza alcun valore di confronto, quindi perché è if (user.Exists())una buona idea semplicemente perché quella proprietà / funzione è di tipo booleano e puoi rinominare la funzione / proprietà per leggere più come l'inglese naturale? È così brutto seguire lo stesso schema che usiamo per altri tipi diversi dai booleani?

Con altri tipi, ifun'istruzione confronta il valore restituito di una funzione con un valore nel codice, quindi il codice ha un aspetto simile a:

if (user.GetAge() >= 18) ...

Che si legge come "se il punto dell'utente ottiene l'età è maggiore o uguale a 18 ..." vero - non è "inglese naturale", ma direi che object.verbnon ha mai assomigliato all'inglese naturale e questo è semplicemente un aspetto fondamentale della programmazione moderna (per molte lingue tradizionali). I programmatori generalmente non hanno problemi a comprendere l'affermazione di cui sopra, quindi la seguente è peggio?

if (user.CheckExists() == true)

Che normalmente è abbreviato in

if (user.CheckExists())

Seguito dal passo fatale

if (user.Exists())

Sebbene sia stato detto che "il codice viene letto 10 volte più spesso di quanto scritto", è anche molto importante che i bug siano facili da individuare. Supponi di avere una funzione chiamata Exists () che fa sì che l'oggetto esista e restituisce vero / falso in base al successo. Potresti facilmente vedere il codice if (user.Exists())e non individuare il bug: il bug sarebbe molto più ovvio se il codice fosse letto if (user.SetExists())per esempio.

Inoltre, user.Exists () potrebbe facilmente contenere codice complesso o inefficiente, facendo un giro in un database per controllare qualcosa. user.CheckExists () rende chiaro che la funzione fa qualcosa.

Vedere anche tutte le risposte qui: Convenzioni di denominazione: come denominare un metodo che restituisce un valore booleano?

Come nota finale - dopo "Tell Don't Ask", molte delle funzioni che restituiscono true / false scompaiono comunque, e invece di chiedere a un oggetto il suo stato, gli dici di fare qualcosa, cosa che può fare in modo diverso modi in base al suo stato.


2
> Suppose you had a function called Exists() which causes the object to existQuesto è già un problema. Un tale metodo dovrebbe essere un verbo, come Create. Per lo meno lo sarebbe Exist, ma "esistere" come verbo è usato raramente. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.È molto chiaro. Direi che la maggior parte degli sviluppatori sarebbe sorpresa se ciò non facesse altro che restituire un booleano.
RJFalconer

@RJFalconer Most developersè la chiave della tua frase lì. Direi che all developerssarei sorpreso se facesse CheckExists()qualcosa di diverso dal controllare che qualcosa esista. Non è che Exists()sia un nome terribile, solo che CheckExists()è un nome migliore , e questa domanda sta chiedendo, come principio generale, qual è il miglior schema di denominazione? La risposta è trattarla come qualsiasi altra funzione, iniziare il nome con un verbo e non usare un pattern diverso solo perché restituisce un booleano.
Michael Parker

Sì, la domanda riguarda il miglior modello di denominazione MA per i metodi booleani. I metodi bool sono unici e hanno il proprio nome comune: predicato. Non dovresti trattarli come altre funzioni. Mettere un verbo accanto alla domanda nel nome del metodo booleano è ridondante. E ha un impatto negativo sulla leggibilità del codice. La denominazione di metodi booleani sotto forma di domande, senza verbi, è accettata come la migliore pratica nel settore. Esempi: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

@Almir File.Exists è una chiamata estremamente vecchia (almeno punto net 1.1) e non è un buon esempio di standard di leggibilità moderni. Guarda la moderna API dot net core per esempi più moderni di come Microsoft sia d'accordo: github.com/dotnet/sdk , alcuni esempi casuali link link link
Michael Parker

15

L'obiettivo della leggibilità dovrebbe sempre essere quello di scrivere il codice il più vicino possibile al linguaggio naturale. Quindi, in questo caso, userExistssembra la scelta migliore. L'uso del prefisso "è" può comunque essere corretto in altre situazioni, ad esempio isProcessingComplete.


1
Per il tuo secondo esempio, è ProcessingIsComplete più vicino alle lingue naturali? Ad esempio: if (ProcessingIsComplete ())
Yang

9

Vorrei usare userExists () perché 1) ha senso in linguaggio naturale e 2) segue le convenzioni delle API che ho visto.

Per vedere se ha senso nel linguaggio naturale, leggilo ad alta voce. "Se l'utente esiste" suona più come una frase inglese valida di "se l'utente esiste" o "se l'utente esiste". "Se l'utente esiste" sarebbe meglio, ma "il" è probabilmente superfluo nel nome di un metodo.

Per vedere se esiste un file in Java SE 6, dovresti usare File.exists () . Sembra che sarà lo stesso nella versione 7 . C # usa la stessa convenzione , come fanno Python e Ruby . Si spera che questa sia una raccolta abbastanza diversificata da definirla una risposta indipendente dalla lingua. In generale, mi schiererei con i metodi di denominazione in linea con l'API della tua lingua.


5

Ci sono cose da considerare che penso siano mancate da molte altre risposte qui

  1. Dipende se si tratta di un metodo di classe C ++ o di una funzione C. Se questo è un metodo, probabilmente verrà chiamato if (user.exists()) { ... }o if (user.isExisting()) { ... }
    meno if (user_exists(&user)). Questa è la ragione dietro gli standard di codifica per cui i metodi bool di stato dovrebbero iniziare con un verbo poiché si leggeranno come una frase quando l'oggetto è davanti a loro.

  2. Sfortunatamente molte vecchie funzioni C restituiscono 0 per il successo e diverso da zero per il fallimento quindipuòessere difficile determinare lo stile utilizzato a meno che tu non segua tutte le funzioni bool che iniziano con i verbi o si confrontano sempre con true in questo modo if (true == user_exists(&user))


5

La mia semplice regola a questa domanda è questa:

Se il metodo booleano HA già un verbo, non aggiungerne uno. Altrimenti, consideralo. Qualche esempio:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

Puramente soggettivo.

Preferisco userExists(...)perché poi affermazioni come questa leggono meglio:

if ( userExists( ... ) )

o

while ( userExists( ... ) )

1

In questo caso particolare, il primo esempio è un inglese così orribile che mi fa trasalire.

Probabilmente sceglierei il numero tre per come suona quando lo leggo nelle istruzioni if. "Se l'utente esiste" suona meglio di "Se l'utente esiste".

Questo presuppone che verrà utilizzato nei test dell'istruzione if ovviamente ...


1

Mi piace uno di questi:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

0

I nomi dei metodi servono per la leggibilità, solo quelli che si adattano all'intero codice sarebbero i migliori, che nella maggior parte dei casi inizia con condizioni, quindi subjectPredicate segue la struttura naturale della frase.


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.