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);
if (not entity_exists(entity_id))
!
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.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 à appelercreate()
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).Réponses:
É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'accordisNotComplete
//! isComplete est généralement mieuxisIncomplete
// pourrait avoir un sens si 'incomplet' est un état connu de l'objet!isNotComplete
// horrible!isNotComplete == 0
// peut conduire à des vacances permanentesla source
!isNotIncomplete
entity_exists
serait-ilentity_should_be_created
(au lieu deentity_not_exists
)? Ou peut-êtreentity_missing
selon la suggestion de Dan?Je conviens que l'affirmative est plus facile à lire. Vous pourriez essayer
Troisième forme
ou
Quatrième forme
la source
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
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)
ou mieux encore reformuler pour être plus affirmatif
la source