Est-ce jamais une bonne idée d'utiliser le nom du modèle de conception dans les classes d'implémentation? [fermé]

28

Récemment , je suis tombé sur une base de code python modérément large avec beaucoup de MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapteretc. classes.

Alors que d'une part ces noms m'a fait faire des recherches et d' apprendre les modèles correspondants, ils ne sont pas très descriptif de ce que la classe ne .

, Ils semblent aussi tomber dans la liste des mots interdits dans la programmation: variable, process_available_information, data, amount, compute: noms trop larges, qui ne nous disent rien sur la fonction lorsqu'ils sont utilisés par eux - mêmes .

Alors devrait-il y en avoir CommunicationManagerou plutôt PortListener? Ou peut-être que je ne comprends pas du tout le problème ...?

Vorac
la source
si vous connaissez ce que fait le modèle, le nom du modèle est une description décente, mais juste le nom du modèle est une mauvaise idée, il est préférable d'avoir une MyClassFactory, un FooAdapter, etc.
ratchet freak
Modification de la question pour indiquer que les classes n'étaient pas appelées simplement "AbstractFactory", mais que certains mots descriptifs étaient également présents.
Vorac
1
... l'ont-ils sérieusement appelé un Fctoryau lieu d'un Factory, ou est-ce juste une faute de frappe?
Izkata
@Izkata, lol, mon mauvais. Cependant, il y avait un adaptateur et un adaptateur!
Vorac

Réponses:

47
  • AbstractFactoryest en effet un mauvais choix pour un nom. Il n'y a aucun moyen de savoir ce qui est créé par cette usine , et lorsque vous recherchez une entité qui crée Animals, vous ne trouverez jamais l'usine correspondante par son nom.

  • AnimalAbstractFactoryn'est pas non plus un choix judicieux, car dans la plupart des langues, il serait redondant avec le abstractmot - clé dans la signature.

    Cela étant dit, il y a plusieurs bonnes raisons, soulignées par les commentaires, d'inclure réellement Abstractdans le nom: non seulement il y a plusieurs contextes où vous n'avez pas la signature complète, mais juste le nom, mais aussi, en gardant AnimalFactoryune interface peut être un choix judicieux (sauf si, malheureusement, la convention du langage / framework est de préfixer les interfaces avec I).

  • AnimalCreationUtilityserait également un mauvais choix: s'il s'agit d'une usine , rendez les choses plus faciles pour les personnes qui liront le code et l' appelleront une usine .

  • abstract AnimalFactoryest ok. Il ne dispose pas de redondance, et il est clair que c'est une abstraite usine qui délègue la création d'animaux à ses enfants.

Alors oui, inclure le nom du motif de conception est une bonne idée, mais cela ne devrait être qu'une partie du nom et ne devrait pas être redondant avec les autres parties de la signature.

Arseni Mourzenko
la source
2
Pourquoi est-ce mieux que d'écrire un commentaire dans un endroit bien en vue "Dans ce module, nous implémentons MVC. Raisons: ... Modèles: ... Vues: ... Contrôleurs: ... Carte de structure: ... API :. .. ".
Vorac
37
@Vorac: Avoir un nom clair est toujours mieux que de se fier aux commentaires.
Arseni Mourzenko
2
@Vorac tôt ou tard, quelqu'un ajoutera une nouvelle classe sans mettre à jour ce commentaire important (ni même connaître son existence). Bien qu'il soit beaucoup plus difficile d'ignorer une convention de dénomination utilisée de manière cohérente dans l'ensemble de l'application.
Konrad Morawski
2
Pendant que vous parcourez votre solution de projet, allez-vous ouvrir chaque fichier de classe pour trouver ce qu'il fait? C'est pourquoi il est toujours préférable d'avoir des classes / fichiers de noms descriptifs.
matrice
2
Je suis en désaccord avec le deuxième point: je pense que AnimalAbstractFactory est un bon choix, car même s'il est redondant dans la déclaration de classe, il serait très utile dans la déclaration de classe enfant: LionFactory étend AnimalAbstractFactory qui, je pense, est une belle information.
Igor
11

Dépend de l'exemple spécifique. Le modèle Builder est presque toujours mieux servi en nommant votre classe * Builder, alors qu'un Singleton n'a généralement pas besoin d'être nommé comme tel.

Si vous ne mettez pas le nom du modèle dans le nom de votre classe, et peut-être même si vous le faites, vous devriez généralement mettre un commentaire dans la classe qui explique qu'il implémente un modèle spécifique.

MikeFHay
la source
3
La cohérence est cruciale ici, car une fois que seules certaines usines sont appelées ...Factory, il devient assez difficile de réaliser qu'une classe est une usine si son nom rompt cette convention.
Konrad Morawski
10

L'intérêt de l'utilisation des noms de modèle dans les classes est de faciliter la compréhension de ce que fait la classe. Si vous nommez la classe AnimalFactory, il est évident que la classe crée des instances Animal. Si le nom de votre classe comprend le nom d'un modèle et qu'il ne décrit pas ce qu'il fait, vous avez soit choisi un mauvais modèle, soit l'implémenté incorrectement.

Pavels
la source
1

Je pense que cela peut très bien fonctionner. Par exemple:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }
CodeART
la source
1
comment cela répond-il à la question posée? Selon ma lecture, vos "exemples" ne montrent qu'une duplication inutile des noms de classe et des commentaires de code
gnat
Les commentaires doivent justifier le but de chaque classe au cas où le nom de la classe n'est pas apparent pour certains. En les regardant, je sais instantanément que j'ai une commande qui fait quelque chose, une requête qui renvoie des données, un décorateur qui ajoute un comportement supplémentaire au mécanisme de journalisation des exceptions existant et une fabrique qui crée des filtres de compte. À mon avis, plus vous décrivez vos noms de classe, plus il devient facile pour les autres de lire votre code. Si vous utilisez un modèle de conception, dites-le - à la fin de la journée, le but d'avoir des modèles de conception est de faciliter la lecture de votre code par d'autres
CodeART