2013-02-14 3 views
18

Kennt jemand den besten Weg, ein Gott-Objekt umzuformen?Wie refaktorieren Sie eine Gottklasse?

Es ist nicht so einfach wie es in eine Anzahl von kleineren Klassen zu brechen, weil es eine hohe Methodenkopplung gibt. Wenn ich eine Methode herausziehe, ziehe ich normalerweise jede andere Methode aus.

+2

Dies scheint eher unmöglich zu beantworten. – jahroy

Antwort

30

Es ist wie Jenga. Sie werden Geduld und eine ruhige Hand brauchen, sonst müssen Sie alles von Grund auf neu erstellen. Was an sich nicht schlecht ist - manchmal muss man Code wegwerfen.

Weitere Hinweise:

  • Denken Sie, bevor Methoden herausziehen: auf welche Daten funktioniert diese Methode arbeiten? Welche Verantwortung hat es?
  • Versuchen Sie zunächst, die Schnittstelle der Gottklasse beizubehalten und Aufrufe an die neuen extrahierten Klassen zu delegieren. Am Ende sollte die Gottklasse eine reine Fassade ohne eigene Logik sein. Dann können Sie es für Bequemlichkeit halten oder werfen es weg und die neuen Klassen starten nur Hilfe
  • Unit-Tests verwenden: Schreibtests für jede Methode, bevor es das Extrahieren Sie brechen nicht Funktionalität
+0

guter Rat bei der Prüfung der Einheit. Aber ich brauche wirklich eine Methode, die Methoden wirklich zu entwirren. Das ist der Kern des Problems –

+0

, das stark von dem Fall abhängt. Es gibt leider kein (für alle passendes) Rezept (außer "die entsprechenden [Refactoring Patterns] (http://www.refactoring.com/catalog/index.html)"). –

+2

Ich mag die Idee, es in eine Fassade umzuwandeln. Das hilft dabei, dass die Jenga-Teile sich gegenseitig stützen, aber auch das Refactoring weiter vorantreibt. –

11

zu versichern, dass ich davon ausgehen, "God Object" bedeutet eine riesige Klasse (gemessen in Codezeilen).

Die Grundidee ist, Teile seiner Funktionen in andere Klassen zu extrahieren.

Um diejenigen zu finden, die Sie

  • Felder/Parameter, die oft zusammen gewöhnen aussehen kann. Sie könnten sich zusammen in eine neue Klasse von Klassen (oder Teile von Methoden) bewegen, die nur eine kleine Teilmenge der Felder in der Klasse verwenden, die möglicherweise in eine Klasse mit nur diesem Feld verschoben wird.

  • primitive Typen (int, String, boolean). Sie sind oft wirklich Wertobjekte, bevor sie herauskommen. Sobald sie Wertobjekt sind, ziehen sie oft Methoden an.

  • betrachten Sie die Verwendung des Gott-Objekts. Gibt es verschiedene Methoden, die von verschiedenen Kunden verwendet werden? Diese könnten in separaten Schnittstellen gehen. Diese Schnittstellen können wiederum separate Implementierungen haben.

Für tatsächlich, diese Änderungen zu tun sollten Sie einige Infrastruktur und Werkzeuge zu Ihren Diensten haben:

  • Tests: Haben Sie einen (möglicherweise generiert) erschöpfende Reihe von Tests bereit, dass Sie oft laufen können. Seien Sie sehr vorsichtig mit Änderungen, die Sie ohne Tests durchführen. Ich mache diese, aber beschränke sie auf Dinge wie die Extraktionsmethode, die ich komplett mit einer einzigen IDE-Aktion machen kann.

  • Versionskontrolle: Sie möchten eine Versionskontrolle haben, mit der Sie alle 2 Minuten committen können, ohne Sie wirklich zu verlangsamen. SVN funktioniert nicht wirklich. Git tut es.

  • Mikado-Methode: Die Idee der Mikado-Methode ist es, eine Veränderung zu versuchen. Wenn es klasse ist.Wenn Sie nicht bemerken, was bricht, fügen Sie sie als Abhängigkeit zu der Änderung hinzu, mit der Sie begonnen haben. Rollback ändert sich. Wiederholen Sie den Vorgang im resultierenden Diagramm mit einem Knoten, der noch keine Abhängigkeiten aufweist. http://mikadomethod.wordpress.com/book/

0

Bevor Sie beginnen: woher weißt du ein Gott Klasse schlecht ist?

oder zumindest wie messen Sie Gott Klasse?

Versuchen Sie, eine Grenze und Unterschiede zwischen gut-groß-Klasse und schlecht-gott-Klasse zu finden.

Zum Beispiel: Klasse mit einigen zusätzlichen Helfern, Eigenschaften und integrierten util-Methoden, ist ein Kandidat, um in Zukunft Gott-Klasse zu sein, aber es kann auch ein sehr gutes Stück Code sein.

Ich glaube, dass Gott Klasse nur eine große Klasse Körper mit vergessenen oder aufgeschobenen Refactoring ist, aber ein Grund für diese Refactoring wächst mit der Zeit.

Allgemeine Hinweise hier ist eine Verwendung von:

  • Erbe und Mixins,
  • Delegation (ex: Dateien utils, externe Klassen, API/Fassade),
  • Splitting Klasse: Hinzufügen von Unterklassen oder verwandte Klassen,
  • gutes Muster verwenden, wie SOLID,
  • in sich die Kunst des Refactoring Entwicklung,