Seite 1 von 1

Ex 01 : Refactoring

Verfasst: 28. Okt 2007 09:04
von Evgeni
Hallo


in der Liste auf der http://www.refactoring.com ist u.A. folgende Empfehlung zu finden:
Replace Error Code with Exception . Um diese umzusetzen müsste man dann aber an der Klasse TestGeneratePrimes was ändern - dürfen wir das?

z.B.

Code: Alles auswählen

	public static int[] generatePrimes(final int maxValue){
			throws PrimeNumbersException {
		if (maxValue < 2)
			throw new PrimeNumbersException();

                //falls alles OK machen wir weiter
	}

Oder geht das schon über die Aufgabenstellung hinaus?

Verfasst: 28. Okt 2007 10:08
von jlerch
Wäre eine IllegalArgumentException nicht angebrachter?

Die würde auch nicht erfordern das du die Signatur der Methode ändern must.

Verfasst: 29. Okt 2007 12:51
von marcel_b
Die Änderung von TestGeneratePrimes ist ok - sogar gewünscht (Erweiterung der Testfälle).

Die Änderung der Schnittstelle von GeneratePrimes ist auch möglich. Jedoch würde ich den Änderungsgrund kritisch hinterfagen.

Die Fowler-Methode liefert als Rückgabewert nur einen Status-Wert zurück. Der Statuswert gibt Aufschluss darüber, ob die Operation erfolgreich war oder nicht. D.h. jeder Entwickler muss hier den Rückgabewert überprüfen und ggf. eine Fehlerbehandlung starten.

Fowler geht von einem fehlerfreien Programmablauf aus und will diese (häufig vergessenen) Fehlerabfragen verhindern/eliminieren. Dafür macht er den Fehlerzustand explizit durch eine Exception.

Konkret ein solches Problem gibt es im Apache HTTPClient. Hier wird durch ein true oder false Flag angezeigt, ob die Put/Get-Operation geklappt hat oder nicht. Es muss also manuell jedes Mal überprüft werden, ob ein Fehlerzustand vorliegt. Zusätzlich werden noch diverse IOExceptions geworfen. Entwickler, die neu in der API sind, können hier Fehler machen indem sie nur die Exceptions abfangen und den Returnwert nicht überprüfen...


In deinem Fall gibst du ein Ergebnis zurück, das keinem Status entspricht (-1, 0-1 usw.) sondern konkrete Primzahlen. Insofern trifft das Fowler-Beispiel und das Refactoring meiner Meinung nach hier nicht zu. Aber grundsätzlich ist es vernünftig in Erwägung ziehen, ob man eine Exception werfen möchte. In diesem Fall gibt es Leitlinien wann man eine RuntimeException und wann eine "BusinessException" geworfen werden sollte. Aber hier scheiden sich gelegentlich auch die Geister... Wer mehr zu dem Thema lesen will, findet hier einen gute Startdokumentation und Diskussion:

http://java.sun.com/docs/books/tutorial ... index.html