Refactoring Patterns #3 Extract Class

Refactoring Patterns - #3 Extract Class

Mit dem Extract Class Refactoring Pattern kann die Komplexität einer Klasse verringert werden. Dabei wird ein Teil, der in einer Klasse logisch zusammengehört extrahiert.
Die alte Klasse nutz die neue Klasse meistens als Abhängigkeit (dependency).

Als Beispiel für das Extract Class Pattern können wir das Beispiel vom Extract Method Post weiter optimieren:

ERROR: Content Element with uid "2112" and type "beautyofcode_contentrenderer" has no rendering definition!

Extract Class anwenden

Bei lesen des Codes können die Methoden von UserRegistrationService in zwei Gruppen unterteilt werden:

  • Die Validierung der Benutzerdaten in „validateUser“
  • Das Speichern und Prüfen ob ein Benutzer existiert („storeUser“ und „getUserExists“)

Ein Kandidat für „Extract Class“ ist die Extraktion von „storeUser“ und „getUserExists“ in eine neue Klasse „UserRepository“. Die Klasse „UserRepository“ ist dafür verantwortlich Benutzerdaten aus der Datenbank zu holen und in die Datenbank zu schreiben.
Die vorhandene Klasse „UserRegistrationService“ kann das „UserRepository“ verwenden und die Funktionalität ist so klarer getrennt.

Das „UserRepository“ sieht dann so aus:

ERROR: Content Element with uid "2114" and type "beautyofcode_contentrenderer" has no rendering definition!

Der modifizierte „UserRegistrationService“ bekommt eine Instanz des „UserRepository“ als Argument im Konstruktiv übergeben. In modernen Framework kann das „UserRepository“ per „DependecyInjection“ übergeben werden.

Eine Implementierung des „UserRegistrationService“ das ein „UserRepository“ nutzt, sieht so aus:

ERROR: Content Element with uid "2116" and type "beautyofcode_contentrenderer" has no rendering definition!

Nutzen kann man die Klassen im Code dann zum Beispiel so:

ERROR: Content Element with uid "2118" and type "beautyofcode_contentrenderer" has no rendering definition!

Anmerkung: Das ist natürlich ein Minimalbeispiel. In einer fertigen Anwendung würden z.b. die Datenbankzugangsdaten ebenfalls von aussen übergeben werden.

 

Woran Kandidaten für "Extract Class" erkennen

Refactoring Kandidaten für kann man typischerweise daran erkennen:

  • Eine Klasse tut viele Dinge aufeinmal
  • Es gibt Methoden die auf den selben Attributen arbeiten, aber andere Teil der Klasse nicht
  • Diese Methoden gehören logisch zusammen

Navigation