Il est notoirement difficile de trouver de bons noms précis pour les classes. Bien fait, il rend le code plus auto-documenté et fournit un vocabulaire pour raisonner sur le code à un niveau d'abstraction plus élevé.
Les classes qui implémentent un modèle de conception particulier peuvent recevoir un nom basé sur le nom de modèle bien connu (par exemple FooFactory, FooFacade), et les classes qui modélisent directement les concepts de domaine peuvent prendre leurs noms du domaine du problème, mais qu'en est-il des autres classes? Y a-t-il quelque chose comme le thésaurus d'un programmeur vers lequel je peux me tourner lorsque je manque d'inspiration et que je veux éviter d'utiliser des noms de classe génériques (comme FooHandler, FooProcessor, FooUtils et FooManager)?
Réponses:
Je vais citer quelques passages de Implementation Patterns de Kent Beck:
Nom de superclasse simple
Nom de la sous-classe qualifiée
Interface
Pour une discussion plus détaillée, achetez le livre! Ça en vaut la peine! :)
la source
Choisissez toujours MyClassA, MyClassB - Cela permet un joli tri alpha.
Je blague!
C'est une bonne question, et quelque chose que j'ai vécu il n'y a pas si longtemps. Je réorganisais ma base de code au travail et j'avais des problèmes pour savoir où placer quoi et comment l'appeler.
Le vrai problème?
J'avais des cours en faisant trop. Si vous essayez d'adhérer au principe de responsabilité unique , il fera tout tous ensemble beaucoup plus agréable .. Au lieu d'un monolithe PrintHandler classe, vous pouvez décomposer en PageHandler , PageFormatter (et ainsi de suite) et un maître imprimante classe qui rassemble tout cela.
Dans ma réorganisation, cela m'a pris du temps, mais j'ai fini par accumuler beaucoup de code en double, j'ai obtenu ma base de code beaucoup plus logique et j'ai appris énormément quand il s'agit de réfléchir avant de lancer une méthode supplémentaire dans une classe: D
Je ne recommanderais cependant pas de mettre des choses comme des noms de motifs dans le nom de la classe. L'interface des classes devrait rendre cela évident (comme cacher le constructeur d'un singleton). Il n'y a rien de mal avec le nom générique, si la classe sert un objectif générique.
Bonne chance!
la source
L'excellent discours de Josh Bloch sur la bonne conception d'API contient quelques bons conseils:
Si votre problème est de savoir comment nommer les classes internes exposées, vous devriez peut-être les consolider dans une classe plus grande.
Si votre problème est de nommer une classe qui fait beaucoup de choses différentes, vous devriez envisager de la diviser en plusieurs classes.
Si c'est un bon conseil pour une API publique, cela ne peut nuire à aucune autre classe.
la source
Si vous êtes coincé avec un nom, il est parfois judicieux de lui donner un nom à moitié sensé avec l'engagement de le réviser plus tard.
Ne soyez pas paralysé par les noms. Oui, les noms sont très importants, mais ils ne sont pas assez importants pour perdre énormément de temps. Si vous ne pouvez pas trouver un bon nom en 10 minutes, passez à autre chose.
la source
Si un bon nom ne me vient pas à l'esprit, je me demanderais probablement s'il y a un problème plus profond - la classe sert-elle un bon objectif? Si tel est le cas, le nommer devrait être assez simple.
la source
Si votre "FooProcessor" traite vraiment les foos, alors n'hésitez pas à lui donner ce nom simplement parce que vous avez déjà un BarProcessor, BazProcessor, etc. En cas de doute, l'évidence est préférable. Les autres développeurs qui doivent lire votre code n'utilisent peut-être pas le même thésaurus que vous.
Cela dit, plus de spécificité ne ferait pas de mal pour cet exemple particulier. «Processus» est un mot assez large. Est-ce vraiment un "FooUpdateProcessor" (qui pourrait devenir "FooUpdater"), par exemple? Vous n'avez pas besoin d'être trop «créatif» sur la dénomination, mais si vous avez écrit le code, vous avez probablement une assez bonne idée de ce qu'il fait et ne fait pas.
Enfin, rappelez-vous que le nom de classe nu n'est pas tout ce que vous et les lecteurs de votre code devez continuer - il y a généralement des espaces de noms en jeu également. Ceux-ci peuvent souvent donner aux lecteurs suffisamment de contexte pour voir clairement à quoi sert réellement votre classe, même si son nom nu est assez générique.
la source