Train Wreck (Anti-Pattern)
Als Train Wreck wird im Zusammenhang mit Software-Entwicklung ein zu vermeidendes Muster (Anti-Pattern) im Quellcode (Source Code) bezeichnet, bei dem mehrere Methodenaufrufe hintereinander verkettet werden.[1][2][3]
Beispiel:
class Vertrag {
...
if (this.getKunde().getAdresse().getLand() != DE) { ...
}
Problematisch an diesem Muster ist, dass hierdurch das erwünschte Prinzip der losen Kopplung verletzt wird. Im Beispiel sieht man, dass die Klasse Vertrag
nicht nur von der Schnittstelle der Klasse Kunde
abhängig ist, sondern auch von Adresse
und Land
. Ändert sich nun beispielsweise der Aufbau von Land
(Refactoring), z. B. Umbenennung von DE
zu DEUTSCHLAND
, so muss aufgrund des Vorhandenseins dieser if()
-Zeile auch die Klasse Vertrag
geändert werden.
Besser wäre beispielsweise, wenn die Klasse Kunde
eine Methode istAuslandskunde()
anbieten würde. Dann könnte man die fragliche Zeile einfach umformulieren zu
if (this.getKunde().istAuslandskunde()) { ...
In diesem Fall könnte man Adresse
oder Land
ändern, ohne dass dies Auswirkungen auf die Klasse Vertrag
hätte.
Abgrenzung
[Bearbeiten | Quelltext bearbeiten]Das Train-Wreck-Antipattern darf nicht mit dem (sinnvollen) Decorator-Pattern verwechselt werden: Auch dort werden u. U. viele Methodenaufrufe hintereinander gehängt – allerdings liefern diese jeweils Objekte gleichen Typs und somit gleicher Schnittstelle zurück.