Méthode booléenne nommant la lisibilité

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(...)
78
demandé sur Jed Smith 2009-10-14 18:42:05

11 réponses

public boolean userExists(...)

Serait mon préféré. Comme cela rend vos contrôles conditionnels beaucoup plus comme l'anglais naturel:

if userExists ...

Mais je suppose qu'il n'y a pas de règle dure et rapide - juste être cohérent

71
répondu Martin 2009-10-14 14:45:52

Je dirais userExists, parce que 90% du temps mon appel code ressemblera à ceci:

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

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

if isUserExist et if doesUserExist sembler redondant.

31
répondu Kai 2014-02-02 13:51:20

Le but de la lisibilité devrait 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 juste dans d'autres situations, par exemple isProcessingComplete.

14
répondu Konamiman 2009-10-14 14:53:11

Méfiez-vous de sacrifier clarté, tout en chassant lisibilité.

Bien que if (user.ExistsInDatabase(db)) lit mieux que if (user.CheckExistsInDatabase(db)), considérons le cas d'une classe avec un modèle de constructeur, (ou toute classe sur laquelle vous pouvez définir l'État):

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

Il n'est pas clair si ExistsInDatabase vérifie s'il existe ou définit le fait qu'il existe. Vous n'écririez pas if (user.Age()) ou if (user.Name()) sans aucune valeur de comparaison, alors pourquoi if (user.Exists()) est-il une bonne idée uniquement parce que propriété / fonction est de type booléen et vous pouvez renommer la fonction / propriété en savoir plus comme 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, if instruction compare la valeur de retour d'une fonction à une valeur de code, de sorte que le code ressemble à quelque chose comme:

if (user.GetAge() >= 18) ...

Qui se lit comme "si l'utilisateur dot get age est supérieur ou égal à 18..."vrai - ce n'est pas "anglais naturel", mais je dirais que object.verb jamais ressemblé à l'anglais naturel et c'est simplement une facette de base de la programmation moderne (pour de nombreuses langues grand public). Les programmeurs n'ont généralement pas de problème à comprendre la déclaration ci-dessus, alors ce qui suit est-il 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 bugs soient faciles à repérer. Supposons que vous aviez un fonction appelée Exists() qui provoque l'existence de l'objet et renvoie true/false en fonction du succès. Vous pourriez 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.

En outre, l'utilisateur.Exists() pourrait facilement contenir du code complexe ou inefficace, en allant vers une base de données pour vérifier quelque chose. utilisateur.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?

Comme note finale-après "Tell Don't Ask", beaucoup de 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.

11
répondu Michael Parker 2017-05-23 12:02:43

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 dans le langage naturel, lisez-le à haute voix. "Si l'utilisateur existe" sonne plus comme un valide expression anglaise que "si l'utilisateur existe" ou "si l'utilisateur ne existe pas". "Si l'utilisateur existe" serait mieux, mais "la" est probablement superflu dans un nom de méthode.

Pour voir si un fichier existe dans Java SE 6, Vous utilisez Fichier.existe () . On dirait que ce sera le même dans la version 7 . C# utilise de la même convention, comme Python et Ruby. Espérons que c'est une collection assez diversifiée pour appeler cela une réponse agnostique de la langue. Généralement, je serais du côté des méthodes de nommage en accord avec L'API de votre langue.

8
répondu David 2015-12-16 12:36:09

Il y a des choses à considérer que 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. Si c'est 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 que les méthodes d'état bool devraient commencer par un verbe car elles se liront comme une phrase lorsque l'objet est en face d'elles.

  2. Malheureusement beaucoup D'anciennes fonctions C retournent 0 pour réussir et non nul pour l'échec, il peut donc être difficile de déterminer le style utilisé à moins que vous ne suiviez les fonctions all bool commençant par des verbes ou toujours comparer à true comme ceci if (true == user_exists(&user))

5
répondu Lee Ballard 2011-11-21 12:04:16

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, pour le considérer. Quelques exemples:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
2
répondu Jonathan 2014-07-07 19:56:08

J'aime l'un de ces:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
1
répondu John Kugelman 2009-10-14 14:48:40

Purement subjectif.

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

if ( userExists( ... ) )

Ou

while ( userExists( ... ) )
1
répondu zumalifeguard 2014-09-09 08:36:06

Dans ce cas particulier, le premier exemple est un anglais si 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 instructions if. "Si l'utilisateur existe" sonne mieux que "Si l'utilisateur ne existe".

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

0
répondu Dana 2009-10-14 14:48:04

Les noms de méthodes servent à la lisibilité, seuls ceux qui correspondent à votre code entier seraient les meilleurs, ce qui, dans la plupart des cas, commence par des conditions, subjectPredicate suit une structure de phrase naturelle.

0
répondu Yuan 2011-01-18 08:25:15