20 Jahre Erfahrung FreeCall 0800 tutegos

Methodenaufrufe vereinfachen (Making Method Calls Simpler)

Benenne Methode um (Rename Method)

Der Name einer Methode macht ihre Absicht nicht deutlich.

Ändere den Namen der Methode.

[UML]

Siehe auch Seite 273 aus Refactoring.

Parameter hinzufügen (Add Parameter)

Eine Methode benötigt mehr Informationen vom Aufrufer.

Nimm einen Parameter für ein Objekt hinzu um die zusätzliche Informationen mitzugeben.
[UML]

Für mehr Informationen siehe Seite 275 in Refactoring.

Entferne Parameter (Remove Parameter)

Ein Parameter wird vom Methodenrumpf nicht mehr benötigt.

Entferne es.

[UML]

Für mehr Informationen siehe Seite 277 in Refactoring.

Trenne Anfrage vom Verändern (Separate Query from Modifier)

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.

[UML]

Für weitere Informationen siehe Seite 279 in Refactoring.

Parametrisiere Methode (Parameterize Method)

Verschiedene Methoden führen ähnliche Dinge mit verschiedenen Werten im Rumpf aus.

Schreibe eine Methode, die einen Parameter für die verschiedenen Werte nutzt.

[UML]

 

Korrekturen

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.

Ersetze Parameter durch explizite Methoden (Replace Parameter with Explicit Methods)

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();
	}
[ARROW]
	void setHeight(int arg) {
		_height = arg;
	}
	void setWidth (int arg) {
		_width = arg;
	}

Für weitere Informationen siehe Seite 285 in Refactoring.

Vorhandenes Objekt übergeben (Preserve Whole Object)

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);										 
[ARROW]
		withinPlan = plan.withinRange(daysTempRange());

Für mehr Informationen siehe Seite 288 von Refactoring.

Ersetze Parameter durch Methode (Replace Parameter with Method)

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);

[ARROW]
		int basePrice = _quantity * _itemPrice;
		double finalPrice = discountedPrice (basePrice);

Für weitere Informationen siehe Seite 292 in Refactoring.

Parameter-Objekt einführen

Eine Gruppe von Parametern die sich zusammenfassen lassen.

Ersetze diese Parametergruppe mit einem Objekt

[UML]

Mehr Informationen auf Seite 295 in Refactoring.

Entferne Setter

Ein Attribut sollte zum Zeitpunkt des Erzeugens initialisiert werden und danach nicht mehr geändert werden.

Entferne jede setter-Methode für dieses Attribut

[UML]

Mehr Informationen auf Seite 300 in Refactoring.

Verstecke eine Methode (Hide Method)

Keine andere Klasse nutzt eine Methode.

Mache die Methode privat.

[UML]

Für mehr Informationen siehe Seite 303 von Refactoring.

Ersetze Konstruktor mir Fabrik-Methode (Replace Constructor with Factory Method)

Wenn ein Objekt erzeugt wird, soll noch mehr gemacht werden.

Ersetze den Konstruktor durch eine Fabrik-Methode.

	Employee (int type) {
		_type = type;
	}
[ARROW]
	static Employee create(int type) {
		return new Employee(type);
	}

Für weitere Informationen siehe Seite 304 in Refactoring

Weitere Kommentare

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);

Explizite Typanpassung kapseln (Encapsulate Downcast)

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();
}
[ARROW]
Reading lastReading() {
	return (Reading) readings.lastElement();
}

Für mehr Informationen siehe Seite 308 von Refactoring.

Ersetze Fehlercodes durch Ausnahmen (Replace Error Code with Exception)

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;
		}
	}

[ARROW]
	void withdraw(int amount) throws BalanceException {
		if (amount > _balance) throw new BalanceException();
		_balance -= amount;
	}

Mehr Informationen auf Seite 310 in Refactoring.

Vermeide Ausnahmen durch Tests (Replace Exception with Test)

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;
		}
	}
[ARROW]
	double getValueForPeriod (int periodNumber) {
		if (periodNumber >= _values.length) return 0;
		return _values[periodNumber];
	}

Für mehr Informationen siehe Seite 315 von Refactoring.