38 votes

Classes à éviter (code complet)

Je suis un peu confus au sujet d'un paragraphe dans le code livre complet.

Dans la section "Classes d'éviter" il lit:

"Éviter les classes nommées après des verbes d'Une classe qui n'a qu'comportement, mais aucune donnée n'est généralement pas vraiment une classe. Envisager de transformer une classe comme DatabaseInitialization() ou StringBuilder() dans une routine sur une autre classe"

Mon code se compose principalement des verbes des classes sans données. Il y a invoicereaders, pricecalculators, messagebuilders etc. Je fais ça pour concentrer les classes à une tâche de chacun. Puis-je ajouter des dépendances à d'autres classes pour d'autres fonctionnalités.

Si je comprends le point correctement, je devrais utiliser un code comme

class Webservice : IInvoiceReader, IArticleReader {
    public IList<Invoice> GetInvoices();
    public IList<Article> GetArticles();
}

plutôt que de

class InvoiceReader : IInvoiceReader {
    public InvoiceReader(IDataProvider dataProvider);
    public IList<Invoice> GetInvoices();
}

class ArticleReader : IArticleReader {
    public ArticleReader(IDataProvider dataProvider);
    public IList<Article> GetArticles();
}

Modifier Merci pour toutes les réponses.

Ma conclusion, c'est que mon code actuel est de plus PRS que OO mais qu'il souffre également de la "anémique modèle de domaine".

Je suis sûr que les thèses intuitions pour m'aider dans l'avenir.

20voto

Ash Points 31541

La classe des noms comme InvoiceReader, PriceCalculator, MessageBuilder, ArticleReader, InvoiceReader ne sont pas réellement des verbes noms. Ils sont vraiment "nom de l'agent nom" les noms de classe. Voir l'agent de noms.

Un verbe nom de la classe serait quelque chose comme la Valider, Exploiter, Gérer, etc. Évidemment, ceux-ci sont mieux utilisées que les méthodes et serait très maladroit de la classe des noms.

Le plus gros problème avec "nom de l'agent nom" les noms de classe, c'est qu'ils peuvent donner de très peu de sens à ce que la classe n' (par exemple UserManager, DataProcessor etc). En conséquence, ils sont plus susceptibles d'être gonflé et la perte de cohésion interne. (Voir Le Principe De Responsabilité Unique).

Par conséquent, la classe de Service web avec le IInvoiceReader et IArticleReader interfaces est probablement la plus claire et la plus significative OO design.

Cela vous donne la simple, évident nom de la classe nom de "WebService", avec "nom de l'agent nom" les noms d'interface clairement annoncer que la classe de Service web peut faire pour les appelants.

Vous pourriez probablement aussi de donner plus de sens à la classe réelle, en préfixant par un autre nom, par exemple PaymentWebService.

Cependant, les interfaces sont toujours mieux qu'un seul nom de classe à décrire plus précisément ce que la classe peut faire pour les appelants. La classe devient plus complexe, de nouvelles interfaces peuvent également être ajoutés avec des noms significatifs.

11voto

Aaronaught Points 73049

- Je ignorer cette "règle", personnellement. L' .NET Framework lui-même est plein de "verbe" classes: TextReader, BinaryWriter, XmlSerializer, CodeGenerator, StringEnumerator, HttpListener, TraceListener, ConfigurationManager, TypeConverter, RoleProvider... si vous pensez que le Cadre est mal conçu, puis par tous les moyens, ne pas utiliser de noms comme ceux-ci.

Steve intention est compréhensible. Si vous trouvez vous-même créer des dizaines et des dizaines de classes juste pour effectuer une tâche spécifique, il est probablement un signe d'une anémie du modèle du domaine, où les objets doivent être en mesure de faire ces choses par eux-mêmes ne le sont pas. Mais à un certain point, vous devez faire un choix entre "pur" de la programmation orientée objet et de la SRP.

Ma suggestion serait ceci: Si vous vous trouvez la création d'un "verbe" de la classe qui agit sur un seul "nom" de la classe, pense honnêtement quant à savoir si ou de ne pas le "nom" de la classe peut effectuer l'action par lui-même. Mais ne commencez pas la création de Dieu Objets ou venir avec de sens/noms trompeurs pour le seul but d'éviter le verbe de la classe.

5voto

Daniel Daranas Points 15123

Ne suivez aucun conseil à l'aveuglette. Ce ne sont que des lignes directrices.

Cela dit, les noms donnent de très bons noms de classe , dans la mesure où ils modélisent des objets logiques. Puisque la classe "Person" est un modèle pour tous les objets "Person", il est très pratique de l'appeler "Person", car cela vous permet de raisonner comme ceci: "Je vais créer une personne à partir de l'entrée de l'utilisateur, mais il me faut d'abord pour le valider ... "

3voto

Coincoin Points 12823

Veuillez noter que l'utilisation du mot "Éviter". Il n'est pas d'éliminer, ou de les éradiquer, ou brûler en enfer si jamais vous les utilisez.

Ce que l'auteur veut dire est que si vous vous retrouvez avec un tas de classes, tous nommés d'après des verbes et tout ce que vous arriver à faire est statiquement créer ces classes, appel d'une fonction et de les oublier, il est probablement un signe que vous êtes séparer un peu trop de classe préoccupations.

Cependant, il y a la situation où la création de classes pour mettre en œuvre une action est une bonne chose, comme lorsque vous avez des stratégies différentes pour la même action. Un très bon exemple est IComparer<>. Il n'est de comparer deux choses, mais il y a plusieurs manière de comparer les choses.

Comme l'auteur le suggère, dans ces cas, une bonne façon de le faire est par la création d'une interface et de la mettre en œuvre. IComparer<> vient à l'esprit à nouveau.

Une autre situation lorsqu'il y a une massive de l'état, telles que le chargement de fichiers. Il pourrait être justifié d'encapsuler l'état dans une classe.

2voto

Mongus Pong Points 6902

Essentiellement, ce que le livre dit, c'est que OO design consiste à extraire les objets (les noms) et d'identifier les opérations (les verbes) qui se produisent sur et entre ces objets.

Les noms deviennent les objets, les verbes deviennent les méthodes qui fonctionnent sur ces objets.

L'idée est que l'

de plus près, les modèles de programme le réel monde problème, le mieux le programme va être.

Dans la pratique, la chose utile avec un objet, c'est qu'il peut représenter un état particulier. Ensuite, vous pouvez avoir plusieurs instances de cette classe contenant chacun un état différent de l'état représentent un aspect du problème.

Dans le cas de la InvoiceReader classe

  • vous allez seulement à la création d'une instance
  • le seul état qu'il représente est que de contenant un dataProvider
  • il contient seulement une méthode

il n'y a aucun avantage à le placer dans un objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X