Metodo booleano Denominazione affermativa vs negativa


44

I metodi booleani dovrebbero sempre assumere la forma affermativa, anche quando saranno sempre e solo usati nella forma negativa?

Diciamo che volevo verificare se esiste un'entità prima di crearne una, il mio argomento è che la prima forma in basso è migliore della seconda forma, indipendentemente dal fatto che il metodo sia mai usato nella forma affermativa.

In sintesi, trovo if(!affirmative)più facile da leggere di if(negative). Ho un collega che non è d'accordo, pensieri?

Prima forma:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

Seconda forma:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);

3
C ++? che ne diciif (not entity_exists(entity_id))
Kos,


a-maggio-a-mah-a. Onestamente, mi sono perso !così tante volte il personaggio facendomi capire male il codice finché non lo rileggo di nuovo. Quindi probabilmente sono più d'accordo con il tuo collega. Mi piace la forma che valuta vera quando la esaminate.
Berin Loritsch,

Volevo solo intervenire per dire che if (!exists) create()può essere visto come una cattiva pratica in molte lingue / framework, in quanto tende a non essere thread-safe. Di solito, l'approccio preferito è chiamare create()e gestire specifiche eccezioni o codici di ritorno che affermano che l'entità esiste già. Questa ovviamente non è una risposta alla domanda reale (motivo per cui è solo un commento).
julealgon,

Risposte:


61

I metodi booleani dovrebbero sempre assumere la forma affermativa, anche quando saranno sempre e solo usati nella forma negativa?

Fare regole su queste cose sembra un po 'troppo - non vorrei vedere una linea guida in un documento sugli standard di codifica che dice che non dovrai usare nomi negativi per le proprietà booleane . Ma per quanto riguarda lo stile personale, penso che cercare di mantenere i nomi positivi potrebbe essere un ottimo ideale. Tuttavia, penso che sia anche bello evitare la necessità di essere magri e facili da perdere !. Spesso si possono trovare modi per trasformare un nome negativo in uno positivo:

  • accountHasCharges
  • accountIsClear(uguale a !accountHasCharges)

La chiarezza è la considerazione più importante e una buona ragione per evitare nomi di metodi negativi è che possono portare a doppi negativi o peggio:

  • isComplete // va bene
  • isNotComplete //! isComplete è in genere migliore
  • isIncomplete // potrebbe avere senso se "incompleto" è uno stato noto dell'oggetto
  • !isNotComplete // orribile
  • !isNotComplete == 0 // può portare a ferie permanenti

5
"Non vorrei vedere una linea guida in un documento sugli standard di codifica che dice che non dovrai usare nomi negativi per le proprietà booleane ." - Lascio questo qui ...
AakashM,

16
Hai dimenticato!isNotIncomplete
Ben Lee,

Così sarebbe l'opposto di entity_existsessere entity_should_be_created(al posto di entity_not_exists)? O forse entity_missingsecondo il suggerimento di Dan?
ADTC,

1
È qui che un documento sugli standard di codifica può usare la parola "preferire" piuttosto che "dovrebbe" o "deve".
Wayne Conrad,

15

Sono d'accordo che l'affermazione è più facile da leggere. Potresti provare

Terza forma

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

o

Quarta forma

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);

2

Dipende anche da come verrà utilizzato il metodo. Se verrà utilizzato in entrambi i casi affermativi e negativi, ad es

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

Quindi il nome del metodo dovrebbe essere affermativo, come sopra. Se non sei sicuro di come verrà utilizzato, attenersi a quanto sopra.

Ma se viene utilizzato SOLO in caso negativo, è accettabile quanto segue (forse anche desiderabile)

if (entity_not_exists(entity_id)) create_entity(entity_id);

o anche meglio riformularlo per essere più affermativo

if (entity_is_absent(entity_id)) create_entity(entity_id);
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.