20 Jahre Erfahrung FreeCall 0800 tutegos

Daten organisieren (Organizing Data)

Kapsele eigene Attributzugriffe (Self Encapsulate Field)

Die Klasse greift direkt auf ihre Attribute zu, doch die Verbindung an dieses Attribut wird unbequem.

Erzeuge Getter und Setter für das Array und nutze nur diese zum Attributzugriff.

	private int _low, _high;
	boolean includes (int arg) {
		return arg >= _low && arg <= _high;
	}
[ARROW]

	
private int _low, _high;
boolean includes (int arg) {
  return arg >= getLow() && arg <= getHigh();
}
int getLow() {return _low;}
int getHigh() {return _high;}

Für weitere Informationen siehe Seite 171 in Refactoring.

Ersetze eigenes Attribut durch Objektverweis (Replace Data Value with Object)

Die Klasse definiert ein Element, was zusätzliche Daten oder Verhalten benötigt.

Mache aus dem Element ein eigenständiges Objekt.

[UML]

Mehr Informationen auf Seite 175 in Refactoring.

Ersetze Wert durch Verweis

Eine Klasse mit vielen gleichen Instanzen, möchte man durch eine einziges Objekt ersetzen

Ändere das Objekt zu einem Verweis

[UML]

Mehr Informationen auf Seite 179 in Refactoring.

Ersetze Verweis durch Wert

Man hat ein Referenzobjekt dass klein, unveränderlich und schwierig zu verwalten ist

Ersetze Referenzobjekt durch Wert

[UML]

Mehr Informationen auf Seite 183 in Refactoring.

Verdoppele beobachtete Daten

Daten einer Domäne sind nur in einer GUI-Komponente sichtbar und die Methoden der Domäne benötigen Zugang

Kopiere die Daten in ein Domänenobjekt. Initialisiere einen Observer, der zwischen den zwei Datenteilen synchronisiert.

[UML]

Mehr Informationen auf Seite 189 in Refactoring.

Ersetze Array durch ein Objekt (Replace Array with Object)

Ein Array nimmt Dinge unterschiedlicher Bedeutung an.

Ersetze das Array durch ein Objekt, welches Eigenschaften für die Elemente anbietet.

	String[] row = new String[3];
	row [0] = "Liverpool";
	row [1] = "15";
[ARROW]
	Performance row = new Performance();
	row.setName("Liverpool");
	row.setWins("15");

Für weitere Informationen siehe Seite 186 in Refactoring.

Unidirektionale Beziehung in bidirektionale Beziehung ändern (Change Unidirectional Association to Bidirectional)

Zwei Klassen müssen gegenseitig Eigenschaften nutzen, doch es gibt nur eine Navigation in eine Richtung.

Setze Verweise und ändere Zugriffsfunktionen für Aktualisierungen auf beiden Seiten.

[UML]

Für weitere Informationen siehe Seite 197 in Refactoring.

Weitere Kommentare

Entfernung vornehmen. Das Beispiel (im Buch) zeigt eine Methode addOrder(), aber keine Methode removeOrder(). Zum Löschen schreibe eine Methode ähnlich wie beim Hinzufügen, nur setzte den Customer auf null.

Class Customer ...
 void removeOrder( Order arg ) {
  arg.setCustomer( null );
}

Mitwirkende

Bidirektionale Beziehung in unidirektionale Beziehung ändern (Change Bidirectional Association to Unidirectional)

Es gibt eine beidseitige Beziehung, doch eine Klasse benötigt Eigenschaften der anderen Klasse nicht mehr.

Entferne die unnötige Seite der Assoziation.

[UML]

Für weitere Informationen siehe Seite 200 in Refactoring.

Ersetze magische Zahl durch symbolische Konstante (Replace Magic Number with Symbolic Constant)

Ein Zahl-Literal steht für eine bestimmte Bedeutung.

Lege eine Konstante an. Nenne sie nach den Grund und ersetze die Zahl mit dieser Konstanten.

	double potentialEnergy(double mass, double height) {
		return mass * height * 9.81;
	}
[ARROW]
	double potentialEnergy(double mass, double height) {
		return mass * GRAVITATIONAL_CONSTANT * height;
	}
	static final double GRAVITATIONAL_CONSTANT = 9.81;

Für weitere Informationen siehe Seite 204 in Refactoring

Weitere Kommentare

Eine Methode für eine Konstante nutzen. Für dieses Refactoring wird eine symbolische Konstante eingeführt, welches das übliche Java-Idiom ist. Jedoch gibt es eine Alternative, und zwar eine Methode der Form:

public static double gravitationalConstant() {
 return 9.81;
}

Beteiligte

Kapsele Attribut (Encapsulate Field)

Es gibt ein öffentliches Attribut.

Mache es privat und biete Zugriffsmethoden.

	public String _name
[ARROW]
	private String _name;
	public String getName() {return _name;}
	public void setName(String arg) {_name = arg;}

Mehr Informationen auf Seite 206 in Refactoring.

Kapsele die Collection (Encapsulate Collection)

Eine Methode liefert als Rückgabe eine Collection.

Die Rückgabe wird eine nur-lese Sicht und Hinzufüge- sowie Lösche-Methoden werden angeboten.

[UML]

Für mehr Informationen siehe Seite 208 von Refactoring.

Ersetze einen Datensatz durch eine Datenklasse (Replace Record with Data Class)

Eine Verbindung zu einem Datensatz einer traditionellen Programmierumgebung ist nötig.

Mache für den Datensatz ein einfaches Datenobjekt.

Für weitere Informationen siehe Seite 217 in Refactoring.

Ersetzte Typ-spezifischen Code durch Unterklassen (Replace Type Code with Subclasses)

Ein unveränderlicher Programmcode bestimmt das Verhalten einer Klasse.

Ersetze den Typ-spezifischen Code durch eine Unterklasse.

[UML]

Für weitere Informationen siehe Seite 223 in Refactoring.

Ersetzte Typ-spezifischen Code durch Zustand/Strategie-Muster (Replace Type Code with State/Strategy)

Eine "Was-bin-ich"-Variable bestimmt das Verhalten, aber Unterklassen für das spezifische Verhalten können nicht gebildet werden.

Ersetze den Typ-spezifischen Code durch ein Zustands-Objekt.

[UML]

Für weitere Informationen siehe Seite 227 in Refactoring.

Ersetze Unterklassen durch Attribute (Replace Subclass with Fields)

Unterklassen unterscheiden sich nur durch Methoden, die einen konstanten Wert liefen.

Ändere die Methode mit einem Zugriff auf ein Attribut der Oberklasse und entferne die Unterklassen.

[UML]

Weitere Informationen auf Seite 232 in Refactoring.