Lisibilité des noms de méthode booléenne

120

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(...)
Yuval Adam
la source
21
le premier sonne commeisBabbyFormed
Cela dépend de la langue. Différentes langues ont des conventions différentes; Java et Objective C viennent à l'esprit. Aussi borderline subjective.
Jed Smith
Subjective - assez juste
Yuval Adam
2
Purement subjectif. getUserExistence, userIsNotExtinct, userHasExistentialStateEtc ...
dreamlax
Sartre serait fier
Cornel Masson

Réponses:

112
public boolean userExists(...)

Serait mon préféré. Comme cela rend vos vérifications conditionnelles beaucoup plus proches de l'anglais naturel:

if userExists ...

Mais je suppose qu'il n'y a pas de règle absolue - soyez juste cohérent

Martin
la source
3
"rend votre {appel de méthode} beaucoup plus comme un anglais naturel" sonne comme un excellent test de dénomination rationnelle à tous les niveaux. clarifié ma pensée sur la question - merci!
cori
16
D'un autre côté, pris isolément ou lorsqu'il n'est pas immédiatement après "if", alors "userExists ()" ressemble à une déclaration de fait, plutôt qu'à la question à laquelle il était destiné. Contrairement à "IsUserExisting ()" ou "DoesUserExist ()", qui suit les règles d'ordre des mots en anglais naturel pour les questions simples.
Oskar Berggren
4
..mais pourquoi les méthodes retournant un booléen seraient-elles utilisées en dehors de if? S'ils ont des effets secondaires, c'est encore plus une odeur. if IsUserExisting()et if DoesUserExist()semble horrible et devrait être évité.
RJFalconer
@RJFalconer parfois, vous devrez peut-être utiliser le résultat de cette méthode à plusieurs endroits, vous l'assignez donc à variable. Puisque la méthode est appelée userExists, quel nom de variable allez-vous déclarer? userExistsconvient aux variables, pas aux méthodes. Comme @Oskar l'a écrit - cela ressemble à une déclaration, pas à une question.
Jarosław Wlazło
Pour les situations où il doit y avoir un sujet, un prédicat et un objet, par exemple, UserSessionIsComplete ou IsUserSessionComplete, lequel préférez-vous?
Yang
40

Je dirais userExists, car 90% du temps, mon code d'appel ressemblera à ceci:

if userExists(...) {
  ...
}

et il se lit très littéralement en anglais.

if isUserExistet if doesUserExistsemblent redondants.

Kai
la source
18

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 ExistsInDatabasevé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 ifinstruction 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.verbn'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.

Michael Parker
la source
2
> Suppose you had a function called Exists() which causes the object to existC'est déjà un problème. Une telle méthode devrait être un verbe, comme Create. À tout le moins, ce serait le cas Exist, 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.
RJFalconer
@RJFalconer Most developersest la clé de votre phrase. Je dirais que all developersje serais surpris si CheckExists()rien d'autre que de vérifier que quelque chose existe. Ce n'est pas que ce Exists()soit un nom terrible, c'est juste CheckExists()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.
Michael Parker
Oui, la question porte sur le meilleur modèle de dénomination MAIS pour les méthodes booléennes. Les méthodes booléennes sont uniques et ont leur propre nom commun - prédicat. Vous ne devriez pas les traiter comme d'autres fonctions. Mettre un verbe à côté de la question dans le nom de la méthode booléenne est redondant. Et cela a un impact négatif sur la lisibilité du code. Nommer les méthodes booléennes sous forme de questions, sans aucun verbe, est accepté comme la meilleure pratique de l'industrie. Exemples: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir
@Almir File.Exists est un appel extrêmement ancien (au moins dot net 1.1) et n'est pas un bon exemple de normes de lisibilité modernes. Regardez l'API dot net core moderne pour des exemples plus modernes de la façon dont Microsoft est d'accord: github.com/dotnet/sdk , quelques exemples aléatoires lien lien lien
Michael Parker
15

L'objectif de la lisibilité doit toujours être d'écrire du code le plus proche possible du langage naturel. Donc, dans ce cas, userExistssemble le meilleur choix. L'utilisation du préfixe «est» peut néanmoins être correcte dans d'autres situations, par exemple isProcessingComplete.

Konamiman
la source
1
Pour votre deuxième exemple, est-ce ProcessingIsCompleteplus proche des langues naturelles? Par exemple: if (ProcessingIsComplete ())
Yang
9

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.

David
la source
5

Il y a des choses à considérer qui, je pense, ont été manquées par plusieurs autres réponses ici

  1. 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()) { ... }ou if (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.

  2. 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))

Lee Ballard
la source
5

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:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
Jonathan
la source
2

Purement subjectif.

Je préfère userExists(...)parce que des déclarations comme celle-ci se lisent mieux:

if ( userExists( ... ) )

ou

while ( userExists( ... ) )
zumalifeguard
la source
1

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 ...

Dana
la source
1

J'aime l'un de ceux-ci:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
John Kugelman
la source
0

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.

Yuan
la source
0

Pourquoi ne pas renommer la propriété alors?

if (user.isPresent()) {
Artem Lukanin
la source