Metodo booleano Nome affermativo vs negativo

38

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

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

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

Primo modulo:

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

Secondo modulo:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);
    
posta lynks 02.05.2013 - 14:02
fonte

3 risposte

60

Should boolean methods always take the affirmative form, even when they will only ever be used in the negative form?

Rendere le regole su tali cose sembra un po 'troppo - Non vorrei vedere una linea guida in un documento di standard di codifica che dice non userete nomi negativi per le proprietà booleane . Ma per quanto riguarda lo stile personale, penso che cercare di mantenere i nomi positivi possa essere un ottimo ideale. Tuttavia, penso che sia anche opportuno evitare il bisogno di quel% magro e facilmente mancato di ! . Si può spesso trovare il modo di trasformare un nome negativo in uno positivo:

  • accountHasCharges
  • accountIsClear (uguale a !accountHasCharges )

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

  • isComplete // okay
  • isNotComplete //! isComplete è solitamente migliore
  • isIncomplete // potrebbe avere senso se 'incompleto' è uno stato noto dell'oggetto
  • !isNotComplete // orribile
  • !isNotComplete == 0 // può portare a vacanze permanenti
risposta data 02.05.2013 - 14:38
fonte
15

Sono d'accordo sul fatto che l'affermativo è più facile da leggere. Potresti provare

Terzo modulo

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

o

Quarto modulo

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);
    
risposta data 02.05.2013 - 14:26
fonte
2

Dipende anche da come verrà utilizzato il tuo metodo. Se verrà utilizzato in entrambi i casi affermativo e negativo, ad esempio

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, segui quanto sopra.

Ma se SOLO è usato nel caso negativo, allora il seguente è accettabile (forse anche desiderabile)

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

o ancora meglio riformularlo per essere più affermativo

if (entity_is_absent(entity_id)) create_entity(entity_id);
    
risposta data 20.07.2017 - 12:46
fonte

Leggi altre domande sui tag