web-dev-qa-db-fra.com

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

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

Supposons que je veuille vérifier si une entité existe avant d'en créer une, mon argument est que le premier formulaire ci-dessous est meilleur que le second, que la méthode soit ou non utilisée 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);
44
lynks

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

Faire des règles sur de telles choses semble un peu trop - je ne voudrais pas voir une directive dans un document de normes de codage qui dit tu n'utiliseras pas de noms négatifs pour les propriétés booléennes. Mais pour une question de style personnel, je pense qu'essayer de garder les noms positifs pourrait être un bel idéal. Cependant, je pense qu'il est également bon d'éviter le besoin de ce maigre et facilement manqué !. On peut souvent trouver des moyens de transformer un nom négatif en un 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 pire:

  • isComplete // d'accord
  • isNotComplete //! isComplete est généralement mieux
  • isIncomplete // pourrait avoir du sens si 'incomplet' est un état connu de l'objet
  • !isNotComplete // horrible
  • !isNotComplete == 0 // peut entraîner des vacances permanentes
64
Caleb

Je suis d'accord 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);
15
Dan Pichelman

Cela dépend également de la façon dont votre méthode sera utilisée. S'il doit être utilisé à la fois dans les cas affirmatifs et négatifs, 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 il va être utilisé, respectez ce qui précède.

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

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

ou encore mieux reformuler pour être plus affirmatif

if (entity_is_absent(entity_id)) create_entity(entity_id);
2
Zack Xu