Freitag, Juli 11, 2008

Separation of Concerns: Application Logic vs. Creation Logic

Im Google-Testing-Blog ist mal wieder ein schöner Artikel erschienen: How to Think About the "new" Operator with Respect to Unit Testing. Inhaltlich ist es nicht wirklich neu: Objekterzeugung mit new in Klassen mit Logik ist gefährlich, weil das isolierte Testen kleiner Einheiten erschwert wird. Stattdessen sollte man die Objekterzeugung separieren und Dependency-Injection verwenden.
Auch wenn diese Erkenntnis nicht neu ist, kann sie wahrscheinlich gar nicht oft genug wiederholt werden - viel zu vielen Entwicklern scheint sie fremd zu sein.

Und dann schimmert durch den Artikel noch eine generelle Forderung durch: "Trenne Anwendungslogik immer von Erzeugungslogik". Die meisten Entwickler, die sich der new-Problematik bewusst sind, lagern nicht alle Objekterzeugungen aus. Sie machen das nur an den Stellen, wo es zum Testen auch notwendig ist und das sind längst nicht alle Stellen. Die Erzeugung generell auszulagern, bedeutet etwas erhöhten Programmieraufwand (weil man z.B. Factories schreibt, obwohl man von der Flexibilität zur Zeit keinen Gebrauch macht). Möglicherweise lohnt sich dieser Zusatzaufwand: man muss weniger überlegen, bekommt einheitlicheren Code im Team und muss die Erzeugung später nicht refaktorisieren, wenn man doch isolieren will.


Post bewerten

3 Kommentare:

Bernd Schiffer hat gesagt…

1. Du profitierst von Factories schon dann, wenn es dadurch einfacher zu testen wird. Das reicht mir eigentlich als Motivation aus, Factories einzuführen, auch wenn der Produktivcode nicht von den Factories profitiert.

2. Mag sein, dass ich gerade auf der Leitung hocke, aber an welchen Stellen ist es denn nicht notwendig, die Objekterzeugung auszulagern, damit man besser testen kann?

Stefan Roock hat gesagt…

1. Du profitierst von Factories schon dann, wenn es dadurch einfacher zu testen wird. Das reicht mir eigentlich als Motivation aus, Factories einzuführen, auch wenn der Produktivcode nicht von den Factories profitiert.
Völlig klar. Da sind wir einer Meinung.


2. Mag sein, dass ich gerade auf der Leitung hocke, aber an welchen Stellen ist es denn nicht notwendig, die Objekterzeugung auszulagern, damit man besser testen kann?
Du hast einen Auftrag und Auftragspositionen. Da ist es selten notwendig, Aufträge und Auftragspositionen isoliert voneinander zu testen. Ergo könnte man dem Auftrag den Job geben, die Auftragspositionen mit new zu erzeugen.

Bernd Schiffer hat gesagt…

Danke fürs Beispiel, jetzt wird's klar: Wenn Du die Unit über mehrere Klassen spannst, dann ist das okay, new intern zuzulassen.