2009-07-24 5 views
2

J'ai une grande classe Shape, dont les instances peuvent (devraient) être capables de faire beaucoup de choses. J'ai beaucoup de classes de forme "domaine" qui héritent de cette classe, mais ne fournissent pas de fonctionnalités différentes autres que le dessin eux-mêmes.Comment faire pour casser une grande classe

J'ai essayé de sous-classer la classe Shape, mais tous les objets "domain" hériteront toujours de cette sous-classe.

Comment puis-je diviser la classe? (c'est 300 lignes de texte, C#)

+0

Le code ... Où est-ce? :) –

Répondre

7

Quelques idées (plus comme heuristiques):

1) Examiner les champs de la classe. Si un groupe de champs n'est utilisé que dans quelques méthodes, cela peut indiquer que ce groupe de champs et les méthodes qui l'utilisent peuvent appartenir à une autre classe.

2) En supposant une classe bien nommée, comparez le nom de la classe à ce que la classe fait réellement. Si vous trouvez des méthodes qui font des choses au-delà de ce que vous attendez du nom de la classe, cela peut être un signe que ces méthodes appartiennent à une classe différente. Par exemple, si votre classe représente un client mais s'ouvre également, se ferme et écrit dans un fichier journal, répartissez le code du fichier journal dans une classe Logger. Voir aussi: Single Responsibility Principle (PDF) pour quelques idées intéressantes.

3) Si certaines méthodes appellent principalement des méthodes sur une autre classe, cela pourrait indiquer que ces méthodes doivent être déplacées vers la classe qu'elles utilisent fréquemment (par exemple Feature Envy). ATTENTION: Comme on dit, la rupture est difficile à faire. S'il y a un risque de briser la classe, vous voudrez peut-être mettre en place des tests pour que vous sachiez que vous ne brisez rien en refactorisant. Pensez à lire "Working Effectively with Legacy Code" et le livre "Refactoring".

8

300 lignes me semble raisonnable.

afficher le code si vous voulez vraiment mieux aider

+0

les perceptions peuvent être trompeuses! Peut-être que 298 des 300 lignes sont écrites en rot13? – Sneakyness

+0

@snekay Je ne sais pas de quoi vous parlez. – Tim

2

vous pourriez briser en déléguant des fonctions à d'autres classes d'aide.

mais je suis d'accord que 300 lignes de code n'est pas terrible.

+1 pour l'affichage du code

1

Merci pour le code.

Voici quelques choses que vous pourriez essayer:

1) Refactor le code en double. Ce type de code a été reproduit sept fois:

 Visio.Cell pinX = GetLayoutCell(Visio.VisCellIndices.visXFormPinX); 
     if (pinX != null) 
     { 
      pinX.set_Result("cm", value); 
     } 

Note: Piny calcule également pinx mais ne l'utilise pas sa valeur.

double emploi similaire existe dans: Pos {X, Y} {Début, Fin}

Ce qui rend cette classe plus difficile à briser est que c'est un wrapper autour d'une classe déjà complexe.

Ne connaissant pas très bien le domaine (bien que je sois un expert avec le concept Shape, Circle, Square), je serais tenté de diviser la classe en plusieurs classes qui partagent chacune le même objet Shape.

Voici un croquis:

class EnvironShape { 
    private ShapeProperties _properties; // contains property management code 
    private ShapeCollection _children;  // contains code for acting on children 
    private Decorators  _decorators; // code for accessing decorators 
    private Layers   _layers;  // layer management code 
    private Position  _position;  // code for working with the shape's position 
    // Other code omitted 
} 

je pas immédiatement et directement exposer ces objets (par exemple ShapeCollection publics GetChildren()) mais je commencer faire le délégué EnvironShape à ces objets.

+0

merci beaucoup Tim. – geejay

Questions connexes