2009-07-24 7 views
2

Ich habe eine große Shape-Klasse, deren Instanzen (kann) in der Lage sein, viele Dinge zu tun. Ich habe viele "domain" shape Klassen, die von dieser Klasse erben, aber keine andere Funktionalität als das Zeichnen selbst bieten.Wie man eine große Klasse aufteilt

Ich habe versucht, die Shape-Klasse Unterklasse, aber dann erben alle "Domäne" -Objekte noch diese Unterklasse.

Wie teile ich die Klasse auf? (es ist 300 Textzeilen, C#)

+0

Der Code ... Wo ist es? :) –

Antwort

7

Ein paar Ideen (mehr wie Heuristiken):

1) Überprüfen Sie die Felder der Klasse. Wenn eine Gruppe von Feldern nur in wenigen Methoden verwendet wird, könnte dies ein Zeichen dafür sein, dass diese Gruppe von Feldern und die Methoden, die sie verwenden, möglicherweise in einer anderen Klasse enthalten sind.

2) Unter der Annahme einer gut benannten Klasse, vergleichen Sie den Namen der Klasse mit dem, was die Klasse tatsächlich tut. Wenn Sie Methoden finden, die über das hinausgehen, was Sie von dem Klassennamen erwarten würden, könnte dies ein Zeichen dafür sein, dass diese Methoden zu einer anderen Klasse gehören. Wenn Ihre Klasse beispielsweise einen Kunden darstellt, aber auch öffnet, schließt und in eine Protokolldatei schreibt, brechen Sie den Protokolldateicode in eine Protokollierungsklasse auf. Siehe auch: Single Responsibility Principle (PDF) für einige interessante Ideen.

3) Wenn einige der Methoden in erster Linie Methoden für eine andere Klasse aufrufen, könnte dies ein Zeichen dafür sein, dass diese Methoden in die Klasse verschoben werden, die sie häufig verwenden (z. B. Feature Envy).

ACHTUNG: Wie sie sagen, ist das Auflösen schwierig. Wenn es ein Risiko gibt, die Klasse aufzulösen, sollten Sie einige Tests durchführen, damit Sie wissen, dass Sie beim Umgestalten nichts kaputt machen. Lesen Sie "Working Effectively with Legacy Code" und das Buch "Refactoring".

8

300 Zeilen scheint mir vernünftig.

schreiben den Code, wenn Sie wirklich besser helfen wollen

+0

Wahrnehmungen können täuschen! Vielleicht sind 298 der 300 Zeilen in rot13 geschrieben? – Sneakyness

+0

@snekay Ich bin mir nicht sicher, wovon du sprichst. – Tim

2

Sie durch Delegieren Funktionen an andere Hilfsklassen brechen könnte.

aber ich stimme zu, dass 300 Zeilen Code nicht schrecklich ist.

+1 für die Buchung der Code

1

Danke für den Code.

Hier sind ein paar Dinge, die Sie könnten versuchen:

1) Umgestalten doppelten Code. Diese Art von Code wurde etwa sieben Mal dupliziert:

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

Hinweis: piny berechnet auch Pinx aber seinen Wert nicht verwenden.

ähnliche Überschneidungen gibt es in: Po {X, Y} {Start, Ende}

Was diese Klasse schwieriger macht zu brechen ist, dass es ein Wrapper um eine bereits komplexe Klasse.

Da ich die Domain nicht sehr gut kenne (obwohl ich ein Experte für das Shape-, Circle-, Square-Konzept bin), wäre ich versucht, die Klasse in mehrere Klassen zu teilen, die jeweils das gleiche Shape-Objekt teilen.Hier

ist eine Skizze:

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 
} 

würde ich nicht sofort und direkt auf diese Objekte aussetzen (zum Beispiel öffentliche Shapecollection GetChildren()), aber ich würde machen die EnvironShape Delegierten auf diese Objekte beginnen.

+0

vielen Dank Tim. – geejay

Verwandte Themen