Für mehr Informationen siehe Seite 275 in Refactoring.
Ein Parameter wird vom Methodenrumpf nicht mehr benötigt.
Entferne es.
Für mehr Informationen siehe Seite 277 in Refactoring.
Eine Methode liefert einen Wert zurück und ändert gleichzeitig den Zustand des Objekts.
Schreibe zwei Methoden. Eine für die Anfrage und eine zur Modifikation.
Für weitere Informationen siehe Seite 279 in Refactoring.
Verschiedene Methoden führen ähnliche Dinge mit verschiedenen Werten im Rumpf aus.
Schreibe eine Methode, die einen Parameter für die verschiedenen Werte nutzt.
Verdeutlichung der Technik: Nach einem Vorschlag von Prof. Kahlbrandt gibt es eine bessere Technik für dieses Refactoring (Änderungen sind fett)
Mitwirkende: Bernd Kahlbrandt.
Für weitere Informationen siehe Seite 283 in Refactoring.
Eine Methode führt abhängig von bestimmen übergebenen Argumenten Programmcode aus.
Lege für jedes der möglichen Argumente eine Methode an.
void setValue (String name, int value) { if (name.equals("height")) { _height = value; return; } if (name.equals("width")) { _width = value; return; } Assert.shouldNeverReachHere(); }
void setHeight(int arg) { _height = arg; } void setWidth (int arg) { _width = arg; }
Für weitere Informationen siehe Seite 285 in Refactoring.
Von einem Objekt ausgelesene Werte sind Argumente einer anderen Methode.
Übergebe gleich das ganze Objekt.
int low = daysTempRange().getLow(); int high = daysTempRange().getHigh(); withinPlan = plan.withinRange(low, high);
withinPlan = plan.withinRange(daysTempRange());
Für mehr Informationen siehe Seite 288 von Refactoring.
Ein Objekt ruft eine Methode und übergibt das Ergebnis als Argument an eine andere Methode. Der Empfänger könnte ebenso diese Methode aufrufen.
Entferne den Parameter und lasse den Empfänger die Methode aufrufen.
int basePrice = _quantity * _itemPrice; discountLevel = getDiscountLevel(); double finalPrice = discountedPrice (basePrice, discountLevel);
int basePrice = _quantity * _itemPrice; double finalPrice = discountedPrice (basePrice);
Für weitere Informationen siehe Seite 292 in Refactoring.
Eine Gruppe von Parametern die sich zusammenfassen lassen.
Ersetze diese Parametergruppe mit einem Objekt
Mehr Informationen auf Seite 295 in Refactoring.
Ein Attribut sollte zum Zeitpunkt des Erzeugens initialisiert werden und danach nicht mehr geändert werden.
Entferne jede setter-Methode für dieses Attribut
Mehr Informationen auf Seite 300 in Refactoring.
Keine andere Klasse nutzt eine Methode.
Mache die Methode privat.
Für mehr Informationen siehe Seite 303 von Refactoring.
Wenn ein Objekt erzeugt wird, soll noch mehr gemacht werden.
Ersetze den Konstruktor durch eine Fabrik-Methode.
Employee (int type) { _type = type; }
static Employee create(int type) { return new Employee(type); }
Für weitere Informationen siehe Seite 304 in Refactoring
Dimitri Paltchoun machte darauf aufmerksam, dass neben Class.forName() und einer Zeichenfolge mit dem Klassenamen für das zu erzeugende Objekt auch das Class-Objekt selbst verwendet werden kann. Das führt zu einer Methode wie
static Employee create(Class c){ try{ return (Employee)c.newInstance(); }catch(Exception e){ throw new IllegalException("Unable to instantiate" +c); } }
Vom Programmcode ist es so aufzurufen:
Employee.create(Engineer.class);
Eine Methode liefert ein Objekt, welches vom Aufrufer mit einer expliziten Typanpassung angepasst werden muss.
Die explizite Typanpassung wird in die Methode gesetzt.
Object lastReading() { return readings.lastElement(); }
Reading lastReading() { return (Reading) readings.lastElement(); }
Für mehr Informationen siehe Seite 308 von Refactoring.
Eine Methode liefert im Fehlerfall einen speziellen Rückgabewert.
Löse im Fehlerfall eine Exception aus.
int withdraw(int amount) { if (amount > _balance) return -1; else { _balance -= amount; return 0; } }
void withdraw(int amount) throws BalanceException { if (amount > _balance) throw new BalanceException(); _balance -= amount; }
Mehr Informationen auf Seite 310 in Refactoring.
Auf Grund eines Fehlers vom aufrufenden Client wird eine Exception ausgelöst.
Die aktuellen Parameter werden vorher getestet.
double getValueForPeriod (int periodNumber) { try { return _values[periodNumber]; } catch (ArrayIndexOutOfBoundsException e) { return 0; } }
double getValueForPeriod (int periodNumber) { if (periodNumber >= _values.length) return 0; return _values[periodNumber]; }
Für mehr Informationen siehe Seite 315 von Refactoring.