Train Wreck (Anti-Pattern)

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

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.

Quellen Bearbeiten

  1. https://wiki.c2.com/?TrainWreck
  2. https://dzone.com/articles/train-wreck-pattern-%E2%80%93-much
  3. https://devcards.io/train-wreck