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 ExistsInDatabase
sta 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, if
un'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.verb
non 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.
isBabbyFormed