Méfiez-vous de sacrifier la clarté tout en recherchant la lisibilité .
Bien que se if (user.ExistsInDatabase(db))
lit mieux que if (user.CheckExistsInDatabase(db))
, considérez le cas d'une classe avec un modèle de générateur (ou de toute classe sur laquelle vous pouvez définir l'état):
user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
Il n'est pas clair si cela ExistsInDatabase
vérifie s'il existe ou s'il établit le fait qu'il existe. Vous n'écririez pas if (user.Age())
ou if (user.Name())
sans aucune valeur de comparaison, alors pourquoi est-ce if (user.Exists())
une bonne idée simplement parce que cette propriété / fonction est de type booléen et que vous pouvez renommer la fonction / propriété pour qu'elle ressemble plus à l'anglais naturel? Est-ce si mauvais de suivre le même modèle que nous utilisons pour d'autres types autres que les booléens?
Avec d'autres types, une if
instruction compare la valeur de retour d'une fonction à une valeur dans le code, de sorte que le code ressemble à quelque chose comme:
if (user.GetAge() >= 18) ...
Ce qui se lit comme "si l'utilisateur dot get age est supérieur ou égal à 18 ..." vrai - ce n'est pas un "anglais naturel", mais je dirais que cela object.verb
n'a jamais ressemblé à l'anglais naturel et qu'il s'agit simplement d'une facette de base de la programmation moderne (pour beaucoup de langues courantes). Les programmeurs n'ont généralement pas de problème à comprendre l'énoncé ci-dessus, est-ce que ce qui suit est pire?
if (user.CheckExists() == true)
Ce qui est normalement abrégé en
if (user.CheckExists())
Suivi de l'étape fatale
if (user.Exists())
Bien qu'il ait été dit que "le code est lu 10 fois plus souvent qu'écrit", il est également très important que les bogues soient faciles à repérer. Supposons que vous ayez une fonction appelée Exists () qui provoque l'existence de l'objet et renvoie vrai / faux en fonction du succès. Vous pourriez facilement voir le code if (user.Exists())
et ne pas repérer le bogue - le bogue serait beaucoup plus évident si le code lisaitif (user.SetExists())
par exemple.
De plus, user.Exists () pourrait facilement contenir du code complexe ou inefficace, allant dans une base de données pour vérifier quelque chose. user.CheckExists () indique clairement que la fonction fait quelque chose.
Voir aussi toutes les réponses ici: Conventions de dénomination : comment nommer une méthode qui renvoie un booléen?
En guise de note finale - après "Tell Don't Ask", de nombreuses fonctions qui retournent vrai / faux disparaissent de toute façon, et au lieu de demander à un objet son état, vous lui dites de faire quelque chose, ce qu'il peut faire de différentes manières. moyens basés sur son état.
isBabbyFormed