Question simple, du point de vue de la lisibilité, quel nom de méthode préférez-vous pour une méthode booléenne:
public boolean isUserExist(...)
ou:
public boolean doesUserExist(...)
ou:
public boolean userExists(...)
api
naming-conventions
readability
Yuval Adam
la source
la source
isBabbyFormed
getUserExistence
,userIsNotExtinct
,userHasExistentialState
Etc ...Réponses:
Serait mon préféré. Comme cela rend vos vérifications conditionnelles beaucoup plus proches de l'anglais naturel:
Mais je suppose qu'il n'y a pas de règle absolue - soyez juste cohérent
la source
if
? S'ils ont des effets secondaires, c'est encore plus une odeur.if IsUserExisting()
etif DoesUserExist()
semble horrible et devrait être évité.userExists
, quel nom de variable allez-vous déclarer?userExists
convient aux variables, pas aux méthodes. Comme @Oskar l'a écrit - cela ressemble à une déclaration, pas à une question.Je dirais
userExists
, car 90% du temps, mon code d'appel ressemblera à ceci:et il se lit très littéralement en anglais.
if isUserExist
etif doesUserExist
semblent redondants.la source
Méfiez-vous de sacrifier la clarté tout en recherchant la lisibilité .
Bien que se
if (user.ExistsInDatabase(db))
lit mieux queif (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 pasif (user.Age())
ouif (user.Name())
sans aucune valeur de comparaison, alors pourquoi est-ceif (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: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?Ce qui est normalement abrégé en
Suivi de l'étape fatale
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.
la source
Suppose you had a function called Exists() which causes the object to exist
C'est déjà un problème. Une telle méthode devrait être un verbe, commeCreate
. À tout le moins, ce serait le casExist
, mais «exister» en tant que verbe est rarement utilisé.It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.
C'est très clair. Je dirais que la plupart des développeurs seraient surpris si cela faisait autre chose que renvoyer un booléen.Most developers
est la clé de votre phrase. Je dirais queall developers
je serais surpris siCheckExists()
rien d'autre que de vérifier que quelque chose existe. Ce n'est pas que ceExists()
soit un nom terrible, c'est justeCheckExists()
un meilleur nom, et cette question demande, en règle générale, quel est le meilleur modèle de dénomination? La réponse est de la traiter comme n'importe quelle autre fonction, de commencer le nom par un verbe et de ne pas utiliser un modèle différent simplement parce qu'il renvoie un booléen.L'objectif de la lisibilité doit toujours être d'écrire du code le plus proche possible du langage naturel. Donc, dans ce cas,
userExists
semble le meilleur choix. L'utilisation du préfixe «est» peut néanmoins être correcte dans d'autres situations, par exempleisProcessingComplete
.la source
ProcessingIsComplete
plus proche des langues naturelles? Par exemple: if (ProcessingIsComplete ())J'irais avec userExists () parce que 1) cela a du sens en langage naturel, et 2) il suit les conventions des API que j'ai vues.
Pour voir si cela a du sens en langage naturel, lisez-le à voix haute. «Si l'utilisateur existe» ressemble plus à une expression anglaise valide que «si l'utilisateur existe» ou «si l'utilisateur existe». "Si l'utilisateur existe" serait mieux, mais "le" est probablement superflu dans un nom de méthode.
Pour voir si un fichier existe dans Java SE 6, vous utiliseriez File.exists () . On dirait que ce sera la même chose dans la version 7 . C # utilise la même convention , tout comme Python et Ruby . Espérons qu'il s'agit d'une collection suffisamment diversifiée pour appeler cela une réponse indépendante de la langue. En général, je serais du côté des méthodes de dénomination en accord avec l'API de votre langage.
la source
Il y a des choses à considérer qui, je pense, ont été manquées par plusieurs autres réponses ici
Cela dépend s'il s'agit d'une méthode de classe C ++ ou d'une fonction C. S'il s'agit d'une méthode, elle sera probablement appelée
if (user.exists()) { ... }
ouif (user.isExisting()) { ... }
non
if (user_exists(&user))
. C'est la raison pour laquelle les normes de codage stipulent que les méthodes booléennes doivent commencer par un verbe puisqu'elles se liront comme une phrase lorsque l'objet est devant elles.Malheureusement, beaucoup d'anciennes fonctions C renvoient 0 pour succès et non nul pour échec, il peut donc être difficile de déterminer le style utilisé à moins que vous ne suiviez toutes les fonctions booléennes commençant par des verbes ou toujours comparées à vrai comme ça
if (true == user_exists(&user))
la source
Ma règle simple à cette question est la suivante:
Si la méthode booléenne A déjà un verbe, n'en ajoutez pas. Sinon, réfléchissez-y. Quelques exemples:
la source
Purement subjectif.
Je préfère
userExists(...)
parce que des déclarations comme celle-ci se lisent mieux:ou
la source
Dans ce cas particulier, le premier exemple est un anglais tellement horrible qu'il me fait grimacer.
J'irais probablement pour le numéro trois à cause de la façon dont cela sonne en le lisant dans les déclarations if. "Si l'utilisateur existe" sonne mieux que "Si l'utilisateur existe".
Cela suppose qu'il sera utilisé dans les tests d'instruction if bien sûr ...
la source
J'aime l'un de ceux-ci:
la source
Les noms de méthode servent à la lisibilité, seuls ceux qui correspondent à votre code entier seraient les meilleurs, dans la plupart des cas, ils commencent par des conditions, donc subjectPredicate suit la structure de la phrase naturelle.
la source
Pourquoi ne pas renommer la propriété alors?
la source