2010-07-23 1 views
4

Je n'ai commencé que très récemment à me développer professionnellement. J'ai étudié la POO à l'université, mais je n'ai pas l'impression de l'avoir vraiment utilisé dans un scénario «réel». Fondamentalement, en essayant de créer/manipuler un type spécifique de document au sein de l'organisation, j'ai créé une classe pour cela, en pensant que chaque fois que nous voulions créer/manipuler ce type spécifique de document, nous pouvions simplement créer un instance de lui et lui donner certaines informations et le faire prendre soin de lui-même. Je sais que nous prévoyons de travailler avec d'autres types de documents (je devrais noter, quand je dis types de documents, je veux dire quelque chose comme "rapport de dépenses" ou "liste d'inventaire", comme dans I je me suis référé au contenu.) J'ai supposé que tous ces types de documents partageraient certains types de fonctionnalités (par exemple, travailler avec des chaînes partagées ou des noms définis dans Excel), donc j'ai créé une classe Document abstraite, et pensé chaque type du document que nous voulions créer pourrait étendre cette classe. Bien sûr, je ne travaille que sur un type de document, alors même si j'ai une idée des méthodes qui peuvent être communes à tous les documents, je n'ai pour l'instant qu'une seule classe abstraite et une seule l'étend, donc il semble sorte de superfétatoire.Devrais-je utiliser une classe de base abstraite à cette fin pour le moment?

Je suppose que mes questions sont:
1) Devrais-je même utiliser une classe abstraite ici. Est-ce que cela ressemble à l'utilisation appropriée d'un ou ai-je complètement manqué le point?
2) Si je devais en utiliser un, ne devrais-je pas l'utiliser si tôt? Je veux dire, devrais-je attendre d'avoir plusieurs documents devant moi pour que je puisse déterminer quel type de fonctionnalité est partagé entre tous plutôt que de supposer que je sais pour l'instant même si je n'ai qu'une seule classe pour l'implémenter?

Merci.

Répondre

3

La classe abstraite ressemble à peu près à votre description: certaines propriétés et certains comportements sont communs à tous les types dérivés (certains d'entre eux peuvent être des comportements 'par défaut' que les classes dérivées peuvent changer). Cependant, certaines des classes dérivées peuvent avoir un comportement supplémentaire/alternatif des autres. S'il n'y avait pas de comportement «par défaut» et seulement une spécification de méthode, une interface aurait été plus appropriée. Quant à savoir s'il est trop tôt: Vous êtes certain que vous devrez absolument définitivement besoin de plus d'une classe dérivée. Je n'aurais pas pris la peine de mettre en place des classes de base abstraites jusqu'à ce qu'il n'y ait aucun doute possible que cela serait nécessaire. Ceci est connu comme YAGNI (vous n'allez pas en avoir besoin); ne créez pas de code avant la dernière minute possible, sinon vous n'en aurez peut-être jamais besoin et vous vous serez chargé d'une maintenance potentielle supplémentaire.

+0

Je vais répondre ici à la fois pour m'avoir aidé à confirmer que le résumé est, théoriquement, la bonne façon de procéder (si j'aurai plus de classes dérivées), mais aussi pour mettre l'accent sur la bonne pratique de codage (YAGNI). J'apprécie également le commentaire de Jlafay sur la réponse d'Adeel selon laquelle écrire une classe de base tôt serait bénéfique, et pour être honnête, je suis presque certain qu'il y aura plus de classes dérivées. Cependant, même si je suis un nouveau développeur, je devrais savoir que dans le monde de l'entreprise, même si je suis «certain», il y aura besoin de plus, cela ne signifie pas nécessairement que ça finira comme ça. –

2

Comme le but d'une classe abstraite est de fournir une définition commune d'une classe de base que les classes dérivées peuvent partager. donc c'est parfait à utiliser ici.

+0

Je pense que c'est le cas parfait aussi. Je voudrais ajouter que si le développeur est sûr qu'ils devront dériver d'une classe de base, écrire une classe de base abstraite tôt serait bénéfique. – jlafay

0

Est-ce que cela doit être résumé: Oui.

Pour vous devriez l'utiliser si tôt. Oui, c'est une règle simple 1, 2, 3. Si vous devez écrire quelque chose une fois, d'accord. Deux fois, pensez à le rendre commun en fonction de sa taille. Trois fois définitivement le rendre commun. Je suis un grand fan de rendre les choses aussi génériques que possible. Je me fâche quand je dois écrire la même chose plus d'une fois.

0

Je suggérerais qu'il peut être utile de définir à la fois une classe abstraite et une ou plusieurs interfaces. Utilisez généralement les paramètres et les variables des types d'interface sauf dans les routines qui traitent de la création d'objets (utilisez la classe abstraite pour ceux-ci). Le document de base et l'interface peuvent prendre en charge certaines fonctions de base comme GetPageCount, RenderToScreenBitmap, RenderToPrinter, RenderToHtml, GetVersionInfo, etc. Une classe de document qui hérite de la classe de document abstraite pourrait utiliser la logique par défaut pour toutes ces fonctions qu'elle n'a pas besoin de modifier. Utiliser l'interface plutôt que le type de base, cependant, permettrait à quelqu'un d'adapter un autre type de document (qui pourrait hériter de quelque chose de complètement différent) pour être utilisable sur votre système en ajoutant les fonctions d'interface nécessaires. Notez qu'il serait probablement bon d'utiliser une sorte de modèle d'adaptateur pour des choses comme l'impression et le rendu, mais cela dépasse le cadre de la question initiale. Le rendu pour l'affichage à l'écran est différent du rendu pour l'impression (il peut ne pas y avoir de subdivision ferme en "pages"). Il est donc probablement judicieux d'avoir des méthodes différentes pour ces fonctions. pensée.

Questions connexes