2010-08-19 5 views
0

Dans le but de maximiser la réutilisation du code, j'ai créé une hiérarchie de classes assez complexe pour mon code Python. Cela ressemble à ceci:Simplification de la hiérarchie des classes complexes

class ElectionMethod 
    class IterativeMethod 
     class SNTV 
     ... 
    class NonIterativeMethod 
     class OrderDependent 
      class CambridgeSTV 
      ... 
     class OrderIndependent 
      class WIGM 
       class ERS97STV 
       ... 
      class Recursive 
       class MeekSTV 
       ... 

Seules les feuilles de la hiérarchie de classe sont jamais instanciées dans des objets. Cela sert son but de maximiser la réutilisation du code, mais le code lui-même est compliqué (certaines classes ont une vingtaine de méthodes) et étant donné les nombreux niveaux, il peut être long de trouver où quelque chose est implémenté. J'ai essayé de sortir des blocs de fonctionnalité et de mettre cette fonctionnalité dans un objet séparé, mais je n'ai pas trouvé un bon moyen de le faire puisque presque toutes les fonctionnalités dépendent de données communes. Par exemple, je peux déplacer du code vers un objet différent, mais il doit se référer à la grande hiérarchie complexe pour obtenir les données dont il a besoin, donc ce n'est pas vraiment de l'encapsulation.

Quelqu'un a-t-il des conseils sur la façon de rendre cela plus gérable?

+1

Il n'y a pas grand chose à dire sans connaître les détails du projet! Vous devez examiner attentivement la conception et déterminer ce qui doit être hérité de quoi. – katrielalex

+0

Merci pour les suggestions. Je vais devoir regarder de plus près pour voir s'ils peuvent travailler pour moi. –

Répondre

1

Multi-method s pourrait, en fonction de votre architecture, être une autre solution valable à ce genre de problème. L'idée est de rendre les fonctions de niveau des modules de méthodes qui peuvent agir sur n'importe quelle instance de classe qu'il serait souhaitable de leur passer. Voici un autre lien qui les examine en tant que alternative to multiple inheritance. Il s'appelle les fonctions génériques mais l'idée est similaire. Il traite également de l'implémentation intégrée non documentée du concept par python.

Si vous pouviez déplacer tout ce qui ne concerne pas le paramétrage ou l'obtention de valeurs d'instance particulières d'une classe vers des fonctions de niveau module et que le code de niveau classe implémente une interface état-exposition/modification, alors vous pourriez même ne pas avoir besoin de méthodes multiples.

+0

Votre lien a une faute de frappe, au fait, +1 de moi, cependant. –

+0

@Joe Bon à regarder. Fixé. Check it out - Guido montre comment les implémenter. – aaronasterling

2

Si la seule difficulté est de trouver où quelque chose est implémenté, vous n'avez peut-être pas besoin de refactoriser. Au lieu de cela, recherchez des extensions dans votre éditeur actuel, ou passez à une autre qui prend en charge les sauts-à-définitions. Par exemple, emacs with ropemacs installed saute aux définitions lorsque le curseur est placé sur un nom d'objet et Ctrl-c g est enfoncé.

Je suis sûr qu'il existe des astuces similaires si vous utilisez vi/vim.

+0

@ ~ unutbu mes pensées exactement, ressemble plus à un problème de documentation/éditeur d'un problème de conception pauvres – Chris

+0

Merci pour la suggestion. J'utilise WingIDE qui a des caractéristiques similaires. –

0

Ceci est un problème classique, donc il n'y a pas de réponse universelle (sinon ce n'était pas un problème). Mais a plusieurs solutions couramment utilisées. L'un d'eux - SOLID principes dans la conception. Vous n'avez donc pas besoin de rechercher des fonctionnalités à travers les niveaux de votre hiérarchie, vous pouvez facilement les trouver ou les implémenter dans un élément de code unique responsable. Et si vous avez besoin d'accéder à des données communes, vous devez créer des objets responsables de l'accès à ces données.

La conception par contrat et en particulier la technique d'injection de dépendances nécessite généralement un support de structure, alors effectuez une recherche sur suitable platform.

Questions connexes