Méthode booléenne nommant affirmatif vs négatif

44

Les méthodes booléennes doivent-elles toujours prendre la forme affirmative, même lorsqu'elles ne seront jamais utilisées que sous forme négative?

Supposons que je veuille vérifier si une entité existe avant d'en créer une. Mon argument est que la première forme ci-dessous est meilleure que la seconde, que la méthode soit utilisée ou non sous la forme affirmative.

En résumé, je trouve if(!affirmative)plus facile à lire que if(negative). J'ai un collègue qui n'est pas d'accord, des pensées?

Première forme:

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

Deuxième forme:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);
lynks
la source
3
C ++? if (not entity_exists(entity_id))
Kos
à-mai-à-mah-à. Honnêtement, le !personnage me manque tellement de fois, ce qui me fait mal comprendre le code jusqu'à ce que je le relise à nouveau. Donc, je suis probablement plus d'accord avec votre collègue. J'aime la forme qui est vraie lorsque vous l'examinez.
Berin Loritsch
Je voulais juste dire que cela if (!exists) create()peut être considéré comme une mauvaise pratique dans de nombreux langages / frameworks, car il a tendance à ne pas être thread-safe. En général, l’approche privilégiée consiste à appeler create()et à gérer des exceptions spécifiques ou des codes de retour indiquant que l’entité existe déjà. Ce n’est bien sûr pas une réponse à la question (c’est pourquoi il s’agit d’un commentaire uniquement).
julealgon

Réponses:

61

Les méthodes booléennes doivent-elles toujours prendre la forme affirmative, même lorsqu'elles ne seront jamais utilisées que sous forme négative?

Établir des règles sur ce genre de choses me semble un peu compliqué - je ne voudrais pas voir une ligne directrice dans un document sur les normes de codage qui dit que vous n'utiliserez pas de noms négatifs pour les propriétés booléennes . Mais pour ce qui est du style personnel, je pense qu’essayer de garder les noms positifs pourrait être un idéal idéal. Cependant, je pense qu'il est également bon d'éviter le besoin de ce maigre et facilement manqué !. On peut souvent trouver le moyen de transformer un nom négatif en nom positif:

  • accountHasCharges
  • accountIsClear(identique à !accountHasCharges)

La clarté est la considération la plus importante, et une bonne raison d'éviter les noms de méthode négatifs est qu'ils peuvent conduire à des doubles négatifs ou à un résultat pire:

  • isComplete // d'accord
  • isNotComplete //! isComplete est généralement mieux
  • isIncomplete // pourrait avoir un sens si 'incomplet' est un état connu de l'objet
  • !isNotComplete // horrible
  • !isNotComplete == 0 // peut conduire à des vacances permanentes
Caleb
la source
5
"Je ne voudrais pas voir de directive dans un document sur les normes de codage qui dit que vous n'utiliserez pas de noms négatifs pour les propriétés booléennes ." - Je vais laisser ça ici ...
AakashM
16
Vous avez oublié!isNotIncomplete
Ben Lee
Alors, le contraire entity_existsserait-il entity_should_be_created(au lieu de entity_not_exists)? Ou peut-être entity_missingselon la suggestion de Dan?
ADTC
1
C'est là qu'un document de normes de codage peut utiliser le mot "préfère" plutôt que "devrait" ou "doit".
Wayne Conrad
15

Je conviens que l'affirmative est plus facile à lire. Vous pourriez essayer

Troisième forme

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

ou

Quatrième forme

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);
Dan Pichelman
la source
2

Cela dépend également de la manière dont votre méthode va être utilisée. S'il doit être utilisé à la fois dans les cas affirmatif et négatif, par exemple

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

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

Ensuite, le nom de la méthode doit être affirmatif, comme ci-dessus. Si vous ne savez pas comment vous allez l’utiliser, respectez ce qui précède.

Mais si elle est seulement utilisé dans le cas négatif, ce qui suit est acceptable (peut - être même souhaitable)

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

ou mieux encore reformuler pour être plus affirmatif

if (entity_is_absent(entity_id)) create_entity(entity_id);
Zack Xu
la source