Nommer les Classes - Comment éviter d'appeler tout un "Manager"? [fermé]

il y a longtemps, j'ai lu un article (je crois une entrée de blog) qui m'a mis sur la" bonne " voie sur la dénomination des objets: être très très scrupuleux au sujet de nommer des choses dans votre programme.

par exemple, si mon application était (comme une application d'affaires typique) traitant les utilisateurs, les entreprises et les adresses, j'aurais un User , un Company et un Address classe de domaine - et probablement quelque part un UserManager , un CompanyManager et un AddressManager apparaîtrait que les poignées de ces choses.

alors pouvez-vous dire ce que font ces UserManager , CompanyManager et AddressManager ? Non, Car Manager est un terme très très générique qui correspond à tout ce que vous pouvez faire avec vos objets de domaine.

l'article que j'ai lu recommande d'utiliser des noms très spécifiques. Si c'était une application C++ et que le travail du UserManager était d'allouer et de libérer les utilisateurs du tas, il ne gérerait pas les utilisateurs mais garderait leur naissance et leur mort. Hum, on pourrait appeler ça un UserShepherd .

ou peut-être le UserManager 'S travail est d'examiner les données de chaque objet de L'Utilisateur et de signer les données cryptographique. On aurait un UserRecordsClerk .

Maintenant que cette idée coincé avec moi, j'essaie de l'appliquer. Et trouver cette idée simple étonnamment difficile.

je peux décrire ce que font les classes et (tant que je ne glisse pas dans quick & dirty coding) les classes que j'écris font exactement un chose. Ce qui me manque pour passer de cette description aux noms, c'est une sorte de catalogue de noms, un vocabulaire qui relie les concepts aux noms.

en fin de compte, je voudrais avoir quelque chose comme un catalogue de motifs dans mon esprit (souvent les motifs de conception fournissent facilement les noms d'objet, par exemple un usine )

  • usine-crée d'autres objets (nom tiré du dessin)
  • Berger - berger gère la durée de vie des objets, leur création et à l'arrêt
  • Synchroniseur - Copie de données entre deux ou plusieurs objets (ou de l'objet hiérarchies)
  • nounou-aide les objets à atteindre un état" utilisable "après leur création - par exemple en câblant à d'autres objets

  • etc.

alors, comment faites-vous gérer ce problème? Avez-vous un vocabulaire fixe, inventez-vous de nouveaux noms à la volée ou considérez-vous nommer des choses pas-si-importantes ou mal?

P.S.: Je suis également intéressé par des liens vers des articles et des blogs traitant de la question. Pour commencer, voici l'article original qui m'a fait réfléchir: nommer les Classes Java sans 'Manager '


mise à jour: résumé des réponses

Voici un petit résumé de ce que j'ai appris de cette question dans l'intervalle.

  • Essayez de ne pas créer de nouvelles métaphores (Nounou)
  • Regardez ce que font les autres cadres

autres articles / livres sur ce sujet:

et une liste à jour des noms préfixes / suffixes que j'ai collectés (subjectivement!) extrait des réponses:

  • Coordinateur
  • Constructeur
  • écrivain
  • Lecteur
  • Gestionnaire
  • conteneur
  • protocole
  • Cible
  • convertisseur
  • contrôleur
  • Vue
  • usine
  • entité
  • seau

et un bon conseil pour la route:

ne nommez pas paralysie. Oui, les noms sont très importants, mais ils ne sont pas assez importants pour perdre beaucoup de temps. Si vous n'arrivez pas à trouver un bon nom en 10 minutes, passez à autre chose.

967
demandé sur froh42 2009-12-08 15:55:28
la source

13 ответов

j'ai demandé un question similaire , mais dans la mesure du possible, j'essaie de copier les noms déjà dans le .net framework, et je cherche des idées dans les cadres Java et Android.

il semble que Helper , Manager , et Util sont les noms inévitables que vous attachez pour coordonner les classes qui ne contiennent aucun état et sont généralement procédurales et statiques. Une alternative est Coordinator .

vous pourriez obtenir particulièrement purple prosey avec les noms et aller pour des choses comme Minder , Overseer , Supervisor , Administrator , et Master , mais comme je l'ai dit je préfère le garder comme les noms de cadre vous êtes habitués.

quelques autres suffixes communs (si c'est le terme correct) que vous trouvez aussi dans le framework .NET sont:

  • Builder
  • Writer
  • Reader
  • Handler
  • Container
158
répondu Chris S 2018-08-22 14:14:18
la source

vous pouvez jeter un oeil à source-code-wordle.de , j'y ai analysé les suffixes les plus fréquemment utilisés des noms de classe du framework .NET et d'autres bibliothèques.

Le top 20 sont:

  • attribut
  • type
  • helper
  • collection
  • convertisseur
  • gestionnaire
  • info
  • fournisseur
  • exception
  • service
  • élément
  • manager
  • nœud
  • option
  • usine
  • contexte
  • élément
  • designer
  • base
  • Editeur
91
répondu Markus Meyer 2012-05-03 01:44:39
la source

je suis tout pour les bons noms, et j'écris souvent sur l'importance de prendre grand soin lors du choix des noms pour les choses. Pour cette même raison, je me méfie des métaphores quand je nomme des choses. Dans la question originale, "usine" et "synchroniseur" ressemblent à de bons noms pour ce qu'ils semblent vouloir dire. Cependant, "shepherd" et "nanny" ne le sont pas, car ils sont basés sur métaphores . Une classe dans votre code ne peut pas être littéralement une nounou; vous l'appelez nounou parce qu'elle s'occupe d'autres choses comme une vraie nounou s'occupe de bébés ou d'enfants. C'est OK dans les discours informels, mais pas OK (à mon avis) pour nommer les classes dans le code qui devra être maintenu par qui sait qui sait quand.

pourquoi? Parce que les métaphores dépendent de la culture et souvent de l'individu. Pour vous, nommer une nounou de classe peut être très clair, mais peut-être que ce n'est pas si clair pour quelqu'un d'autre. Nous ne devrions pas compter sur, sauf si vous écrivez un code qui est réservé à un usage personnel.

dans tous les cas, la convention peut faire ou casser une métaphore. L'utilisation de "factory" elle-même est basée sur une métaphore, mais une métaphore qui existe depuis un certain temps et qui est actuellement assez bien connue dans le monde de la programmation, donc je dirais qu'elle est sûre à utiliser. Cependant, la "nounou" et "berger" sont inacceptables.

55
répondu CesarGon 2009-12-08 19:43:12
la source

nous pourrions nous passer des classes xxxFactory , xxxManager ou xxxRepository si nous modélisions correctement le monde réel:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

; -)

42
répondu herzmeister 2010-01-16 20:27:47
la source

cela ressemble à une pente glissante vers quelque chose qui serait posté sur thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages", etc.

je suppose qu'il est juste qu'une classe de Manager monolithique ne soit pas une bonne conception, mais utiliser 'Manager' n'est pas mauvais. Au lieu de UserManager nous pourrions le décomposer en UserAccountManager, UserProfileManager, UserSecurityManager,etc.

"Manager" est un bon mot parce qu'il montre clairement qu'une classe ne représente pas une un truc du monde réel. 'AccountsClerk' - Comment suis-je censé dire si c'est une classe qui gère les données des utilisateurs, ou représente quelqu'un qui est un Commis aux comptes pour leur travail?

31
répondu Mr. Boy 2017-05-25 23:39:20
la source

puisque vous êtes intéressé par des articles dans ce domaine, vous pourriez être intéressé par L'article D'opinion de Steve Yegge "exécution dans le royaume des noms":

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

20
répondu stusmith 2010-01-15 17:44:08
la source

quand je pense à utiliser Manager ou Helper dans un nom de classe, je considère qu'il s'agit d'une odeur de code qui signifie que je n'ai pas encore trouvé la bonne abstraction et/ou je viole le principe de responsabilité unique , donc le remaniement et de mettre plus d'efforts dans le design rend souvent la désignation beaucoup plus facile.

mais même des classes bien conçues ne se nomment pas (toujours) elles-mêmes, et vos choix dépendent en partie de si vous créez les classes de modèles économiques ou les classes d'infrastructure technique.

les classes de Business model peuvent être difficiles, car elles sont différentes pour chaque domaine. Il y a certains termes que j'utilise beaucoup, comme Policy pour les classes de stratégie dans un domaine (par exemple, LateRentalPolicy ), mais ceux-ci découlent généralement d'essayer de créer un" langage ubiquitaire " que vous pouvez partager avec les utilisateurs d'affaires, la conception et la désignation des classes afin qu'ils modèlent des idées, des objets, des actions dans le monde réel, et les événements.

les classes d'infrastructure technique sont un peu plus faciles, car elles décrivent des domaines que nous connaissons très bien. Je préfère incorporer des noms de dessins dans les noms de classe, comme InsertUserCommand, CustomerRepository, ou SapAdapter. . je comprends le souci de communiquer la mise en œuvre plutôt que l'intention, mais les dessins marient ces deux aspects de la conception de classe - au moins quand vous avez affaire à l'infrastructure, où vous voulez la mise en œuvre dessinez pour être transparent même pendant que vous cachez les détails.

17
répondu Jeff Sternal 2010-01-15 19:20:37
la source

être au fait avec des motifs tels que définis par (disons) le Livre GOF , et nommer les objets après cela me fait un long chemin dans la désignation des classes, leur organisation et la communication de l'intention. La plupart des gens comprendront cette nomenclature (ou au moins une grande partie de celle-ci).

8
répondu Brian Agnew 2009-12-08 15:59:12
la source

si Je ne peux pas trouver un nom plus concret pour ma classe que XyzManager, ce serait un point pour moi de reconsidérer si c'est vraiment une fonctionnalité qui appartient ensemble dans une classe, c.-à-d. une "odeur de code" architecturale.

8
répondu Jasper van den Bosch 2012-05-04 00:51:41
la source

je pense que la chose la plus importante à garder à l'esprit est: est le nom suffisamment évocateur? Pouvez-vous dire en regardant le nom que la Classe est censé faire? Utiliser des mots comme" Manager"," Service "ou" Handler " dans vos noms de classe peut être considéré comme trop générique, mais comme beaucoup de programmeurs les utilisent, cela aide aussi à comprendre à quoi sert la classe.

j'ai moi-même utilisé la façade-motif beaucoup (au moins, je pense que c'est ce que l'on appelle). Je pourrais avoir une classe User qui décrit un seul utilisateur, et une classe Users qui garde la trace de ma"collection d'utilisateurs". Je n'appelle pas la classe UserManager parce que je n'aime pas les managers dans la vraie vie et je ne veux pas qu'on me les rappelle :) le simple fait d'utiliser la forme plurielle m'aide à comprendre ce que fait la classe.

4
répondu Droozle 2009-12-08 16:18:55
la source

spécifique à C#, j'ai trouvé "Framework Design Guidelines: Conventions, Idioms, and Patterns for réutilisable .net Libraries" pour avoir beaucoup de bonnes informations sur la logique de la dénomination.

pour ce qui est de trouver ces mots plus précis, j'utilise souvent un thésaurus et je saute à travers des mots apparentés pour essayer d'en trouver un bon. J'essaie de ne pas passer trop de temps avec elle, bien que, comme je progresse à travers le développement, je viens avec de meilleurs noms, ou parfois se rendre compte que SuchAndSuchManager devrait vraiment être divisé en plusieurs classes, et puis le nom de cette classe dépréciée devient un non-problème.

4
répondu AaronLS 2012-09-06 05:22:28
la source

je crois que la chose critique ici est d'être cohérent dans la sphère de la visibilité de votre code, c'est-à-dire aussi longtemps que tous ceux qui ont besoin de regarder/travailler sur votre code comprennent votre convention de nommage alors que ce devrait être bien, même si vous décidez de les appeler "CompanyThingamabob" et "UserDoohickey". Le premier arrêt, si vous travaillez pour une entreprise, est de voir s'il ya une convention de l'entreprise pour la dénomination. S'il n'y a pas ou vous ne travaillez pas pour une entreprise alors créez votre propre en utilisant des termes qui faites du sens pour vous, passez-le autour de quelques collègues de confiance/amis qui au moins code de façon désinvolte, et incorporez tout feedback qui fait du sens.

appliquer la convention de quelqu'un d'autre, même si elle est largement acceptée, si elle ne saute pas de la page à vous est un peu d'une erreur dans mon livre. D'abord et avant tout j'ai besoin de comprendre mon code sans référence à d'autres documents, mais en même temps, il doit être suffisamment générique qu'il n'est pas incompréhensible pour quelqu'un d'autre dans le même champ dans la même industrie.

1
répondu Lazarus 2009-12-08 16:10:51
la source

je considérerais les modèles que vous utilisez pour votre système, les conventions de nommage / catalogage / regroupement de classes de tend à être défini par le modèle utilisé. Personnellement, je m'en tiens à ces conventions de nommage car elles sont le moyen le plus probable pour une autre personne d'être en mesure de récupérer mon code et de l'exécuter.

par exemple UserRecordsClerk pourrait être mieux expliqué comme l'extension d'une interface de RecordsClerk générique que les deux UserRecordsClerk et CompanyRecordsClerk mettre en œuvre et puis se spécialiser, ce qui signifie que l'on peut regarder les méthodes dans l'interface pour voir ce que les sous-classes its font / sont généralement pour.

voir un livre tel que Design Patterns pour info, c'est un excellent livre et pourrait vous aider à clarifier où vous voulez être avec votre code - si vous ne l'utilisez pas déjà! ;o)

je pense que tant que le modèle est bien choisi et utilisé dans la mesure du des noms de classe appropriés, alors assez simples et peu prévenants devraient suffire!

1
répondu Caroline 2009-12-08 16:12:21
la source