Il y a longtemps, j'ai lu un article (je crois une entrée de blog) qui m'a mis sur la "bonne" piste pour nommer les objets: Soyez très très scrupuleux pour nommer les choses dans votre programme.
Par exemple, si mon application gérait (en tant qu'application commerciale typique) des utilisateurs, des entreprises et des adresses, j'aurais un User
, un Company
et une Address
classe de domaine - et probablement quelque part un UserManager
, un CompanyManager
et un AddressManager
apparaîtraient pour gérer ces choses.
Alors, pouvez-vous dire ce que ceux UserManager
-ci CompanyManager
et AddressManager
faire? 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 recommandait d'utiliser des noms très spécifiques. S'il s'agissait d'une application C ++ et que le UserManager
travail consistait à allouer et à libérer les utilisateurs du tas, il ne gérerait pas les utilisateurs mais protégerait leur naissance et leur mort. Hmm, on pourrait peut-être appeler ça un UserShepherd
.
Ou peut-être que le UserManager
travail consiste à examiner les données de chaque objet utilisateur et à signer les données cryptographiquement. Ensuite, nous aurions un UserRecordsClerk
.
Maintenant que cette idée m'est restée, j'essaie de l'appliquer. Et trouvez cette idée simple incroyablement difficile.
Je peux décrire ce que font les classes et (tant que je ne glisse pas dans un codage rapide et sale) les classes que j'écris font exactement une chose. Ce qui me manque pour passer de cette description aux noms, c'est une sorte de catalogue de noms, un vocabulaire qui mappe les concepts aux noms.
En fin de compte, j'aimerais avoir quelque chose comme un catalogue de modèles dans mon esprit (les modèles de conception fournissent souvent facilement les noms d'objets, par exemple une usine )
- Factory - Crée d'autres objets (dénomination tirée du modèle de conception)
- Shepherd - Un berger gère la durée de vie des objets, leur création et leur arrêt
- Synchroniseur - Copie des données entre deux ou plusieurs objets (ou hiérarchies d'objets)
Nanny - Aide les objets à atteindre l'état "utilisable" après leur création - par exemple en les connectant à d'autres objets
etc.
Alors, comment gérez-vous ce problème? Avez-vous un vocabulaire fixe, inventez-vous de nouveaux noms à la volée ou envisagez-vous de nommer des choses pas si importantes ou erronées?
PS: 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 des 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 entre-temps.
- Essayez de ne pas créer de nouvelles métaphores (Nanny)
- Jetez un œil à ce que font les autres frameworks
Autres articles / livres sur ce sujet:
- Quels noms vous trouvez-vous en ajoutant / ajoutant régulièrement aux cours?
- Quelle est la meilleure approche pour nommer les classes?
- Livre: Design Patterns: Elements of Reusable Object-Oriented Software (Relié)
- Livre: Patterns of Enterprise Application Architecture (Relié)
- Livre: Implementation Patterns (Broché)
Et une liste actuelle des préfixes / suffixes de noms que j'ai collectés (subjectivement!) À partir des réponses:
- Coordinateur
- Constructeur
- Écrivain
- Lecteur
- Gestionnaire
- Récipient
- Protocole
- Cible
- Convertisseur
- Manette
- Vue
- Usine
- Entité
- Seau
Et un bon conseil pour la route:
N'obtenez pas la paralysie des noms. Oui, les noms sont très importants, mais ils ne le sont pas suffisamment pour perdre énormément de temps. Si vous ne pouvez pas trouver un bon nom en 10 minutes, passez à autre chose.