web-dev-qa-db-fra.com

Lisibilité de la dénomination des méthodes booléennes

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(...)
99
Yuval Adam
public boolean userExists(...)

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

if userExists ...

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

92
Martin

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 isUserExist et if doesUserExist semble redondant.

34
Kai

L'objectif de lisibilité doit toujours être d'écrire du code le plus proche possible du langage naturel. Dans ce cas, userExists semble le meilleur choix. L'utilisation du préfixe "is" peut néanmoins être appropriée dans d'autres situations, par exemple isProcessingComplete.

14
Konamiman

Méfiez-vous de sacrifier la clarté tout en poursuivant la lisibilité .

Bien que if (user.ExistsInDatabase(db)) soit plus agréable à lire que if (user.CheckExistsInDatabase(db)), considérez le cas d'une classe avec un modèle de générateur (ou toute classe sur laquelle vous pouvez définir un état):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Il n'est pas clair si ExistsInDatabase vérifie si elle existe ou définit le fait qu'elle existe. Vous n'écririez pas if (user.Age()) ou if (user.Name()) sans valeur de comparaison, alors pourquoi if (user.Exists()) est une bonne idée uniquement parce que cette propriété/fonction est de type booléen et vous peut renommer la fonction/propriété pour lire plus comme l'anglais naturel? Est-il si mauvais de suivre le même modèle que nous utilisons pour d'autres types que les booléens?

Avec d'autres types, une instruction if 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 le point de l'utilisateur obtient l'âge est supérieur ou égal à 18 ..." vrai - ce n'est pas "l'anglais naturel", mais je dirais que object.verb N'a jamais ressemblé à l'anglais naturel et c'est simplement une base facette de la programmation moderne (pour de nombreuses langues traditionnelles). Les programmeurs n'ont généralement pas de problème à comprendre la déclaration ci-dessus, est-ce que ce qui suit est pire?

if (user.CheckExists() == true)

Qui est normalement raccourci à

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 disposiez d'une fonction appelée Exists () qui fait exister l'objet et renvoie vrai/faux en fonction du succès. Vous pouvez facilement voir le code if (user.Exists()) et ne pas repérer le bug - le bug serait beaucoup plus évident si le code lisait if (user.SetExists()) par exemple.

De plus, user.Exists () pourrait facilement contenir du code complexe ou inefficace, en effectuant un déclenchement circulaire vers 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 nommage: que nommer une méthode qui renvoie un booléen?

Enfin, après "Tell Don't Ask", de nombreuses fonctions qui renvoient true/false 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. en fonction de son état.

13
Michael Parker

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 à haute voix. "Si l'utilisateur existe" ressemble plus à une expression anglaise valide que "si cet 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 devez tiliser File.exists () . Il semble que ce sera le même dans la version 7 . C # utilise la même convention , tout comme Python et Ruby . Avec un peu de chance, il s'agit d'une collection suffisamment diversifiée pour appeler cela un réponse indépendante de la langue. En général, je serais d'accord avec les méthodes de dénomination conformes à l'API de votre langue.

8
David

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()) { ... }
    pas if (user_exists(&user)). C'est la raison derrière les normes de codage selon lesquelles les méthodes booléennes doivent commencer par un verbe, car elles se liront comme une phrase lorsque l'objet se trouve devant elles.

  2. Malheureusement, beaucoup d'anciennes fonctions C renvoient 0 pour le succès et non nul pour l'échec, donc il peut être difficile de déterminer le style utilisé à moins que vous ne suiviez toutes les fonctions booléennes par des verbes ou que vous compariez toujours à vrai comme si if (true == user_exists(&user))

5
Lee Ballard

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, pensez-y. Quelques exemples:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
3
Jonathan

Purement subjectif.

Je préfère userExists(...) car alors des instructions comme celle-ci se lisent mieux:

if ( userExists( ... ) )

ou

while ( userExists( ... ) )
1
zumalifeguard

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 en raison de la façon dont cela sonne lorsque vous le lisez dans les instructions if. "Si l'utilisateur existe" sonne mieux que "Si l'utilisateur existe".

Cela suppose qu'il sera utilisé dans les tests if, bien sûr ...

1
Dana

J'aime l'un d'eux:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
1
John Kugelman

Les noms de méthode servent à la lisibilité, seuls ceux qui correspondent à tout votre code seraient les meilleurs, la plupart du cas, il commence par des conditions, donc subjectPredicate suit la structure de la phrase naturelle.

0
Yuan

Pourquoi ne pas renommer la propriété alors?

if (user.isPresent()) {
0
Artem Lukanin