Il y a longtemps, j'ai lu un article (un article de blog, je crois) qui m'a mis sur la "bonne" voie pour nommer les objets : Soyez très très scrupuleux pour nommer les objets dans votre programme.
Par exemple, si mon application gère des utilisateurs, des sociétés et des adresses (comme une application commerciale typique), j'aurais un fichier de type User
, a Company
et un Address
classe de domaine - et probablement quelque part une UserManager
, a CompanyManager
et un AddressManager
apparaîtrait pour gérer ces choses.
Alors pouvez-vous dire ce que ces UserManager
, CompanyManager
y AddressManager
faire ? Non, car Manager est un terme très très générique qui correspond à tout ce que vous pouvez faire avec les objets de votre domaine.
L'article que j'ai lu recommandait d'utiliser des noms très spécifiques. S'il s'agissait d'une application C++ et que le UserManager
Le travail de l'utilisateur est d'allouer et de libérer les utilisateurs du tas, il ne gère pas les utilisateurs mais surveille leur naissance et leur mort. Hmm, peut-être que nous pourrions appeler cela un UserShepherd
.
Ou peut-être que le UserManager
Le travail de TU est d'examiner les données de chaque objet utilisateur et de signer les données de manière cryptographique. Nous aurions alors un UserRecordsClerk
.
Maintenant que cette idée est restée dans ma tête, j'essaie de l'appliquer. Et je trouve cette idée simple étonnamment difficile.
Je peux décrire ce que font les classes et (tant que je ne me laisse pas aller à un codage rapide et sale) les classes que j'écris font exactement ce que je veux. un chose. Ce qui me manque pour passer de cette description aux noms est une sorte de catalogue de noms, un vocabulaire qui fait correspondre les concepts aux noms.
En fin de compte, j'aimerais avoir quelque chose comme un catalogue de modèles dans mon esprit (fréquemment, les modèles de conception fournissent facilement les noms d'objets, par exemple une usine )
-
Factory - Crée d'autres objets (dénomination tirée du design pattern)
-
Berger - Un berger gère la durée de vie des objets, leur création et leur fermeture.
-
Synchronizer - Copie les données entre deux ou plusieurs objets (ou hiérarchies d'objets).
-
Nanny - Aide les objets à atteindre un état "utilisable" après leur création, par exemple en les connectant à d'autres objets.
-
etc. etc.
Alors, comment gérez-vous ce problème ? Avez-vous un vocabulaire fixe, inventez-vous de nouveaux noms à la volée ou considérez-vous que nommer les choses n'est pas si important ou incorrect ?
P.S. : Je suis également intéressé par les liens vers les articles et les blogs qui traitent de cette question. Pour commencer, voici l'article original qui m'a fait réfléchir à la question : Nommer les classes Java sans "gestionnaire".
Mise à jour : résumé des réponses
Voici un petit résumé de ce que j'ai appris entre-temps de cette question.
- Essayez de ne pas créer de nouvelles métaphores (Nanny)
- Jetez un coup d'œil à ce que font les autres cadres
Autres articles/livres sur ce sujet :
- Quels sont les noms que vous vous surprenez à ajouter régulièrement à vos cours ?
- Quelle est la meilleure approche pour nommer les classes ?
- Livre : Design Patterns : Elements of Reusable Object-Oriented Software (couverture rigide)
- Livre : Patrons d'architecture d'application d'entreprise (Hardcover)
- Livre : Implementation Patterns (Broché)
Et une liste actuelle de préfixes/suffixes de noms que j'ai recueillis (subjectivement !) à partir des réponses :
- Coordinateur
- Constructeur
- Écrivain
- Lecteur
- Manipulateur
- Container
- Protocole
- Cible
- Convertisseur
- Contrôleur
- Voir
- Usine
- Entité
- Seau
Et un bon conseil pour la route :
Ne tombez pas dans la paralysie des noms. Oui, les noms sont très importants, mais ils ne le sont pas assez pour qu'on y perde un temps fou. Si vous ne parvenez pas à trouver un bon nom en 10 minutes, passez à autre chose.
16 votes
Il appartient au wiki communautaire parce qu'il n'y a pas une seule "meilleure" réponse. Il s'agit d'une discussion.
20 votes
C'est contre-indiqué. Ne devraient-ils pas l'appeler un forum ? J'aurais pensé qu'un wiki serait pour une collection de faits, pas d'opinions.
1 votes
Si vous avez besoin d'un objet "nounou", cela implique qu'il est possible de briser les invariants de votre classe. Il vaut mieux revoir la conception de votre classe.
1 votes
Je suis d'accord avec la suggestion de CW. C'est une bonne question, mais il n'y a pas vraiment de "bonne" réponse unique. Comme Lazarus l'a observé ci-dessous, les conventions de nommage peuvent (et devraient) être modifiées comme il convient pour le domaine d'application spécifique et/ou la société.
0 votes
Voir ces sujets : stackoverflow.com/questions/1274577/class-naming-chaos stackoverflow.com/questions/38019/
0 votes
@DOK : Je ne pense pas que CW veuille dire qu'il n'y a "pas de 'meilleure' réponse". Si c'était le cas, les réponses ne recevraient pas de notes du tout et il ne serait pas possible d'en accepter une comme étant la meilleure réponse. Mais bon, cette discussion n'a pas sa place ici...
99 votes
Merci pour cette mise à jour - mais pouah, ce dernier conseil est terrible ! Si vous ne pouvez pas penser à un bon nom en 10 minutes, il y a probablement quelque chose qui ne va pas avec votre classe. (Avec les mises en garde habituelles : 1) le parfait est l'ennemi du bien, 2) l'expédition est une fonctionnalité - n'oubliez pas que vous contractez une dette technique).
0 votes
Est-il possible de dresser une liste des préfixes et suffixes à éviter ? Je pense à
Processor
ici, c'est ambigu et cela pourrait être n'importe quoi qui prend une entrée et produit une sortie. Aussi dans le même sens,SubSomething
doivent également être évitées.0 votes
@anton1980 Voir le premier commentaire c'est pourquoi ce n'est pas constructif. Je ne vais pas le rouvrir, mais n'hésitez pas à le faire sur Méta Stack Overflow si vous voulez la vue de la communauté.
16 votes
Si vous n'arrivez pas à trouver un bon nom en dix minutes, demandez à votre collègue de vous aider. N'abandonnez pas.
0 votes
J'ai quelques années de retard, mais j'ai commencé à utiliser le suffixe "Clerk". C'est probablement aussi "mauvais" que manager, mais les clercs IRL ne sont capables d'exécuter des fonctions que selon un ensemble strict de règles commerciales. Le "Clerk" indique au consommateur que ce type d'objet ne dispose que de ce genre de fonctions. Si vous ne trouvez pas ce dont vous avez besoin, le clerc doit être étendu, ou un nouveau clerc doit être créé pour faire le travail dont vous avez besoin.
0 votes
JamesM., je pensais justement à la même chose. Dans ce cas, une fermeture es l'ultime "upvote", et bien que cela ne corresponde pas au format question-réponse, il devrait vraiment y avoir une tolérance pour quelque chose qui ressemble à "Pas strictement Q&R, mais très clair et utile, donc autorisé".
0 votes
@JamesM. Bien que ce type d'information soit utile, Programmers.SE ne serait-il pas plus approprié ?
0 votes
Bonne liste. J'en ai utilisé quelques autres dans le passé : Driver, Arbitrator, Declaration, Instance.
12 votes
Si vous ne parvenez pas à trouver un bon nom en 10 minutes, essayez de l'expliquer à vos collègues ; ils pourrait penser à un bon nom (user338195), mais essayer de l'expliquer vous aidera probablement à découvrir ce qui ne va pas ( Jeff ).
0 votes
J'utilise SomeEngine pour remplacer Manager.
2 votes
Si vous ne parvenez pas à trouver un bon nom en dix minutes, le problème n'est pas que vous n'aurez pas de bon nom. Le problème est que vous aurez très probablement une mauvaise conception. En d'autres termes, l'incapacité à trouver un nom clair n'est pas un problème en soi, mais une indication de défauts de conception plus profonds.
0 votes
Vous les appelleriez des classes de gestionnaires alors qu'elles ne font rien ;) [J'ai vu le même modèle dans le cas de *Util *Helper - dans le doute, les gens l'appellent helper et vivent heureux pour toujours. Il est difficile de penser aux bons noms et la plupart des développeurs n'y accordent que peu d'importance, ils choisissent donc la voie la plus facile. Ce sont des problèmes courants que j'essaie de mettre en évidence lors des revues de code.
2 votes
Ajoutez Parser & Formatter à la liste si vous le souhaitez.
0 votes
J'aime l'idée d'une dénomination spécifique, mais je n'aime pas l'approche consistant à utiliser des noms de professions humaines, car cela détourne l'attention du sujet.
0 votes
Les personnes intéressées peuvent lire Exécution dans le royaume des noms
0 votes
Je pense que les noms de classes sont grossièrement divisés en deux groupes : 1, les classes qui données du processus ; 2, classes comme le résultat d'un processus ou d'une conversion . Je suffixerais les noms de la première classe avec un verbe et la deuxième classe, un nom. Par exemple,
UserDataProcessor
,DateFormatter
,MonetaryConvertor
,UtilityHelper
,ApplicationLauncher
,ExceptionHandler
,URLEncoder
,InputValidator
,ObjectMapper
,PatternChecker
pour la classe 1, etProviderResponse
,UserIDNameCompositeKey
,ConnectionClient
,LocalizedMessage
pour la classe 2.0 votes
Mais, je pense aussi que c'est très subjectif, comme
XxxService
oUtils
sont également de bons noms pour moi (classes traitant des données mais avec un nom substantif). La convention est importante, mais le plus important, c'est la lisibilité.2 votes
Une classe pour un utilisateur, puis une classe pour créer l'utilisateur, puis une autre classe pour gérer l'allocation de mémoire de l'utilisateur - en suivant cette voie, vous vous retrouverez avec une base de code contenant 3 fois les classes dont vous avez réellement besoin pour faire le travail, où tout est séparé en une petite classe qui fait exactement une chose parce que Bob est votre oncle. Je veux dire, SOLID c'est bien mais mec, n'en fais pas trop !
1 votes
Le type a raison, si vous ne pouvez pas penser à un nom en 10 minutes (je dirais plutôt 1 minute), passez à autre chose. Comme vous utilisez le TDD (c'est le cas, n'est-ce pas ?), vous allez remanier le code au fur et à mesure et soit la conception évoluera et le nom deviendra clair après un remaniement, soit vous trouverez un nom au fur et à mesure que vous travaillerez.
1 votes
Ce sont tous des noms de code procédural prétendant être orienté objet. Soyez franc à propos de vos procédures : si votre
User<Manag|Help|Controll|Process|Handl|>er
contient un procédure appelécreate
puis l'extraire dans sa propre classe de commande :CreateUser
. vous êtes moins susceptible de cacher des préoccupations sans rapport avec le sujet enCreateUser
que vous ne l'êtes dansUserManager
. vos listes de procédures, et leur complexité, devenant incontrôlables sont un signe que quelque chose peut être extrait dans des modèles qui n'ont pas besoin de suffixe, il suffit de les trouver. un monde sans -ers est possible.0 votes
@TyCobb c'est un bon conseil, j'ai posé cette question il y a de nombreuses années et maintenant il devient clair pour moi que l'une des raisons pour lesquelles c'est difficile est d'essayer de faire entrer dans une conception OO des choses qui ne sont pas OO. Je ne suis pas anti-OO aujourd'hui, mais mon code a un aspect beaucoup plus élevé de code fonctionnel - et soudainement je n'ai plus besoin de m'inquiéter. L'OO a sa place et son utilité, surtout dans les cas où les noms des choses sont faciles à trouver. Si je veux mettre les choses dans des classes, alors votre suggestion est probablement l'une des meilleures à suivre.