Quels anti-modèles de nommage existent? [fermé]


35

Il y a des noms, où si vous vous trouvez à chercher ces noms, vous savez que vous avez déjà foiré quelque chose.

Par exemple:

XxxManager
Cela est mauvais car une classe doit décrire son travail. Si le mot le plus spécifique que vous puissiez trouver pour ce que la classe fait est "gérer", alors la classe est trop grosse.

Quels autres anti-modèles de nommage existent?

Pour clarifier, je ne demande pas "quels noms sont mauvais" - cette question est entièrement subjective et il n'y a aucun moyen d'y répondre. Je demande, "quels noms indiquent les problèmes globaux de conception avec le système." Autrement dit, si vous souhaitez appeler un composant Xyz, cela indique probablement que le composant est mal conçu. Notez également qu'il existe des exceptions à chaque règle. Je recherche simplement des indicateurs d'avertissement lorsque j'ai vraiment besoin d'arrêter et de repenser un dessin.



4
Pour ceux qui votent pour conclure comme "non constructif" - seriez-vous prêt à expliquer la raison? Le seul avec lequel cela ne va pas très bien, c'est que les réponses peuvent être courtes, mais cela respecte certainement les cinq autres directives ...
Billy ONeal


2
@Aaronaught: Des suggestions? J'ai articulé ceci aussi bien que je le peux dans l'édition ....
Billy ONeal

1
@ jhocking - Je suis d'accord avec certains de ces liens - en particulier le fait que "Manager" et "Handler" sont trop précieux pour être lâchés. Et je ne suis pas aussi vendu que sur les alternatives basées sur les motifs de conception et autres, qui semblent au moins aussi vagues dans de nombreux cas. Parfois, "File d'attente" ou ce que vous souhaitez, mais souvent, le fait qu'un gestionnaire conserve (ou référence) des éléments dans une file d'attente n'est qu'un aspect de la gestion de ces éléments. Tout comme quelque chose d'utile est exprimé par "gestionnaire" en tant que titre de poste, la même chose s'applique à la POO.
Steve314

Réponses:


22

Les anti-modèles de dénomination suivants sont liés à .NET et, en particulier, à C #:

  • Incohérences . Si vous avez décidé de commencer chaque nom de champ par un trait de soulignement, respectez-le .
  • Abréviations Ambiguos avec voyelles manquantes . J'ai sérieusement vu des noms de champs tels que cxtCtrlMngr. Vous pouvez difficilement deviner ce que cela est supposé représenter.
  • Noms de variable trop longs et trop détaillés . ILoginAttemptRepositoryest bien et descriptif - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingest descriptif, mais certainement pas bien.

7
Est- Ice que cela signifie interfaceici implementerou la première personne du singulier? Étant donné que la plupart des classes implémentent une interface, avoir trop de classes / interafes commençant par une majuscule Iest ennuyeux et gêne la lisibilité, ainsi que l’odeur du code.
utilisateur inconnu

3
+1 pour "Abréviations Ambiguos avec voyelles manquantes", elles me rendent fou!
FrustratedWithFormsDesigner

6
@Billy ONeal: C ++ a des interfaces; ils ne sont tout simplement pas séparés artificiellement des classes. ;)
Jon Purdy

4
@Billy ONeal: C'était ce que je voulais dire.
Jon Purdy

2
@MariusSchulz: oh oui, je suis d'accord avec vous :) Je pensais que ce n'était pas une abréviation aussi terriblement opaque.
Amara

9

L'une de celles que je rencontre souvent est tout simplement de ne pas utiliser de modèle de dénomination. Cela indique généralement l'ignorance des développeurs (que les modèles de nommage sont une bonne chose ) et que cet anti-modèle a tendance à violer de manière flagrante le PRS en fourrant toutes sortes de méthodes liées à une classe dans cette classe elle-même, par exemple un client La classe a des propriétés, des méthodes CRUD, tout ce qui concerne un client dont une partie de l'application a besoin.

J'ajouterai également qu'utiliser "Engine" comme suffixe revient à peu près à utiliser "Manager". C'est très vague et une classe appelée a XxxEnginetendance à être ce qui équivaut à un module de style VB contenant un tas de méthodes, donc c'est un endroit "facile à utiliser", sans aucune connaissance ni idée de la programmation orientée objet.


7

Eh bien, les réponses les plus simples en premier lieu: tapez hongrois ( http://mindprod.com/jgloss/unmainnaming.html , a également d’autres idées intéressantes. Un point de vue plus équilibré sur les cas où l’hongrois n’est pas mauvais, http://www.joelonsoftware.com /articles/Wrong.html )


7
La notation hongroise est TOUJOURS diabolique :)
Wayne Molina Le

12
@Wayne: En fait, ce n'est pas toujours mauvais. J'ai travaillé pour Charles chez Xerox à la fin des années 70 et le système de dénomination d' origine a sauvé des vies. Nous travaillions dans BCPL qui a 1 type: integer. Tout le reste sur le type a été transmis par l'utilisation et la convention de nommage. Nous avions 7 programmeurs + Charles et chacun d'entre nous pouvait entrer dans le code de quelqu'un d'autre et être immédiatement productif. Cela ne veut pas dire que cela ne peut pas être horriblement tordu / mal appliqué (même par Charles), mais simplement que dans le bon contexte, c'était la bonne solution.
Peter Rowell

3
@Marius: Lisez l'article de Joel. Le système de types ne peut pas toujours appliquer toutes les différences sémantiques entre les variables. Intellisense n’aide pas non plus dans de tels cas.
Billy Oneal

4
Le type est plus facile à déduire que l’utilisation, en particulier. avec les éditeurs modernes. Cependant, il faut de la discipline. Vous n'êtes pas obligé de tout préfixer . Je travaille en Java et la plupart du temps, les applications en hongrois ne sont pas nécessaires, mais lorsque je fais quelque chose qui nécessite plusieurs variables du même type (comme fromX et toX) dans les systèmes de coordonnées, cela sauve la vie.
Michael K

3
Ce qui serait bien, c’est une capacité générale à créer facilement de nouveaux types. "Celui-ci est comme un int, sauf qu'il s'applique aux numéros de ligne."
David Thornley

6

Préfixer un 'I' au nom d'une interface ou 'Abstract' au nom d'une classe abstraite. Cela peut être excusable dans des langages qui n'ont pas le concept de classes abstraites, ou qui ne font pas la différence entre les interfaces et les classes abstraites - mais en Java, par exemple, c'est toujours une mauvaise idée.

De plus, je ne suis pas d'accord avec vous sur la question du gestionnaire. J'utilise parfois ce modèle, et cela signifie simplement que si j'essayais de le nommer autrement, le nom ne serait pas plus descriptif que XxxxxManager. Certaines tâches (pas nécessairement complexes) ne peuvent tout simplement pas être résumées en un ou deux mots.


@ Mike: Je suis totalement en désaccord avec votre déclaration, désolé. À mon avis, XxxxManagerc'est le pire nom possible qu'une classe puisse avoir. Bien sûr, ça gère quelque chose! C'est la raison pour laquelle il a été écrit. Managerest un mot de remplissage sans signification qui n'apporte aucune valeur à la compréhension - par son nom - de ce qu'une classe est responsable.
Marius Schulz

1
Qu'en est-il, disons TabManager? Vous avez un meilleur nom pour une classe qui contrôle un mécanisme de tabulation JSP? Ou halètement TabController ... Pour ce qui est de préfixer avec Abstract, je pense que c'est surutilisé mais qu'il est souvent valide (voir les bibliothèques Java pour des exemples). Je pense pouvoir affirmer en toute sécurité que je n’ai jamais vu d’ Iinterfaces où quiconque n’essaye pas de programmer contre une interface qui n’aurait pas dû être là. Comme, une seule classe implémente l'interface.
Michael K

1
@ Darien (et d'autres): Dans tous les cas, peu importe. Aucun de ces noms n'est anti-modèle (et donc ils sont hors sujet pour cette question). Je ne pense pas que vous puissiez dire quoi que ce soit à propos de la conception d'un système, qu'il utilise IXxxou non XxxImpl.
Billy ONeal

2
C'est tout à fait totalement faux. Il existe de très bonnes raisons de distinguer visuellement les interfaces des classes: (a) elles ne peuvent pas être instanciées, (b) elles ne peuvent pas être libérées / supprimées, (c) elles ne peuvent pas être sérialisées, (d) elles peuvent être mandaté / intercepté, etc., etc., etc. Vous venez de jeter quelque chose que vous n'aimez pas personnellement (pour une raison bizarre et inexpliquée) comme exemple d'anti-pattern sans aucune justification.
Aaronaught

1
Dans la mesure du possible, les interfaces doivent être préférées aux classes concrètes pour les types d'argument et les types de retour. Par conséquent, il est logique que les interfaces obtiennent les noms "propres" et les implémentations concrètes (le type réel que l'appelant peut même ne pas connaître ou ne pas se soucier) pour obtenir les verrues.
Kevin Krumwiede

6

Speeling:

J'ai un handicap mental et je ne peux pas épeler. Sans le correcteur orthographique, je suis impuissant. J'essaie de copier tous les noms que je crée dans un traitement de texte pour vérification, mais j'en manque toujours. Lors de mon dernier projet, j'ai écrit une grande partie de l'API et je suppose que je n'ai pas vérifié l'orthographe la première fois que j'ai utilisé le mot réponse et j'ai supposé que c'était juste parce que personne ne me l'avait dit. Nous avions au moins 50 fonctions avec réponse dans celui-ci. Une nouvelle personne est venue dans l’équipe et a demandé pourquoi nous utilisions la réponse Je me sentais vraiment stupide.


2
J'ai utilisé un plugin jQuery brièvement où l'un des paramètres était affect(au lieu de l'effet). Cela m'a rendu fou et j'ai rapidement trouvé un plugin différent pour faire la même chose.
zzzzBov

4
Le pire problème que j’ai avec c’est que, quand je vois un nom mal orthographié, je ne peux vraiment plus me souvenir de ces noms.
David Thornley

1
Cela empire lorsque la même chose est orthographiée différemment dans différentes parties du code. Comme lorsque vous avez une force de champ de classe Srtength accessible par la méthode getStrenth ().
Eva

5

Eh bien, j'ai peur que mes opinions soient un peu controversées. Mais essayons ...

En ce qui me concerne, je suis d’accord avec Mike Baranczak, des noms tels que XxxController, XxxHandler est quelque chose que nous utilisons très souvent. Pour nous, un contrôleur est quelque chose comme un point d’entrée pour quelque chose "encapsulé", par exemple la gestion de transactions, le traitement d’erreurs inattendues, l’appel de XxxHandler pour effectuer le travail réel. Je dirais qu'un XxxManager est un synonyme de contrôleur. Je pense qu'il est important de ne pas utiliser Manager dans un cas et Controller dans un autre. Être cohérent est très important si vous travaillez en équipe.

Ce serait vraiment difficile, voire impossible, de trouver de meilleurs noms pour des choses comme celle-là. Xxx devrait être bien choisi pour rendre la situation plus claire.

Ce que je n'aime pas personnellement, c'est quand une méthode appelée get ... ou set ... est plus qu'un simple accesseur. J'aime det ... pour déterminer.

Une autre chose qui me vient à l’esprit: selon l’oncle Bob. Un "Et" dans un nom de méthode est un signe de faire trop. Mais la vie n’est pas toujours noire ou blanche - il y a des situations où je pense que ça va - par exemple. en raison de problèmes de performances (lorsque vous avez déjà les données à vérifier, pourquoi ne pas les traiter) ...

Personnellement, je suis aussi un grand fan de la notation hongroise des systèmes - la plupart du temps, vous avez affaire à du code source dans un IDE ok. Mais souvent, vous utilisez uniquement un éditeur ou vous parcourez le référentiel dans un navigateur. Un des inconvénients peut être le support d’outils dû aux préfixes de type ...

Je pense que la chose la plus importante est d'être fidèle - une convention sous-optimale - pour moi - vaut mieux que de ne pas avoir de convention ...


1
"Controller" a une sémantique différente de "Manager". Personnellement, je n'aime pas non plus, mais "Controller" passe, car c'est un composant commun à beaucoup de patterns, en particulier à MVC. XxxHandler est tout aussi mauvais. Si la classe se contente de "manipuler" quelque chose, la classe est trop grosse ou doit simplement s'appeler la partie "Xxx".
Billy ONeal

3
"Il serait très difficile, voire impossible, de trouver de meilleurs noms pour ce genre de chose" - pas si vous avez bien conçu votre hiérarchie de types, avec des dépendances et des responsabilités bien définies. Bien sûr, si vous utilisez "Controller" dans le cadre d'un MVC ou d'un "gestionnaire" pour un gestionnaire d'événements / messages générique, c'est différent - ce sont des exemples de jargon - mais s'ils sont simplement utilisés comme noms génériques classes définies alors c'est un drapeau rouge majeur.
Aaronaught

5

Peut-être le pire anti-modèle de dénomination est-il

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Nous avons une liste à trois éléments de paires [foo, bar]. Si nous en avons besoin d'une quatrième, nous devrons ajouter de nouvelles colonnes à la table.

Conduisant à coder comme ceci:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Un tableau séparé doit être créé avec les colonnes foo et bar et lié au tableau de commandes:

create table fubar(foo string, bar string, stuff_id long)

Le deuxième pire est celui-ci:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Ici, nous avons six champs au lieu de deux instances d'une classe d'adresse.

Cet anti-motif est marqué par une série de noms en deux parties listant chaque combinaison de deux ensembles, par exemple [foo, bar] x [1,2,3] ou [home, perm] x [rue, ville, état]


-1 - cela ne mentionne pas du tout la dénomination.
Billy ONeal

Un anti-motif de dénomination ne peut pas inclure plus d'un nom?
Kevin Cline

Comment faire trop d'arguments ==nommant antipattern? Je suis confus.
Billy ONeal

1
Autant que je sache, la convention en est une qui permet les numéros où un nom réel doit être pris. Ces chiffres donnent une fausse impression, à savoir que les éléments sont une sorte de liste ou de tableau
keppla

3
@Billy ONeal: Oui, ils le font. Le problème de conception est le manque de normalisation et les suffixes numériques sont le modèle de dénomination pointant vers elle.
Reinierpost

3

Toute dénomination de classe ou d’interface qui est une tautologie est mauvaise, pas seulement en Java dont parle le lien, mais dans n’importe quel langage.

Tautologie (rhétorique), utilisant des mots différents pour dire la même chose même si la répétition ne fournit pas de clarté.


2
Intéressant. Des exemples?
Mike Baranczak

2
J'ai lu le lien, il est écrit "tautologie" ...;)
Benjol

10
La première règle du club de tautologie est la première règle du club de tautologie.
Cercerilla

J'ai lu le lien (d'accord, le contenu du lien) et je n'ai trouvé aucun exemple
barjak

ok donc selon ce lien nous devrions cesser d'utiliser I <NomInterface> ... à droite.
Dal

3

Je rencontre fréquemment des bibliothèques de logiciels portant des noms génériques tels que Libraryou Common. Ils indiquent une conception non optimale: les développeurs s'efforcent d'éviter la duplication de code, mais sans chercher à créer une conception décomposée sur la base de la fonctionnalité.


+1 - Je vois "Common" tout le temps.
Morgan Herlocker

1

De Microsoft en nommant, je peux fournir cette liste pour les mauvais noms:

  1. Ils ne sont pas sémantiques, ce qui signifie qu'ils ont des noms qui, au lieu d'insister sur ce qu'ils font, mettent l'accent sur la technologie utilisée ou le modèle sur lequel elle est basée .
  2. Ils ne suivent pas une cohérence syntaxique. Par exemple, une partie des noms sont à boîtier chameau, tandis que l’autre partie est à boîtier calin.
  3. Ce sont des abréviations difficiles à comprendre, comme ScrollableX au lieu de CanScrollHorizontally
  4. Ils sont choisis de manière à déranger les mots-clés de cet environnement.

2
En fait, j'aime bien "ScrollableX" au moins autant que "CanScrollHorizontally". "X" n'est pas vraiment une abréviation.
user1172763
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.