Der Entwickler- Almanach
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Oblivion [PoMO]). Das bedeutet: Es gibt keine funktionalen Abhängigkeiten zwischen Blasen auf<br />
derselben Ebene. Insbesondere beachten Operationen einander nicht.<br />
Funktional ist eine Abhängigkeit, wenn Funktionseinheit C wie Client die Funktionseinheit S wie Service<br />
braucht, um an sie Arbeiten zu delegieren, mit deren Resultaten sie selbst dann weiterarbeitet.<br />
Weiterarbeiten bedeutet, die Resultate in eigener Logik zu verwenden.<br />
Solche Abhängigkeiten sind in der üblichen prozeduralen, objektorientierten und auch funktionalen<br />
Programmierung gang und gäbe. Das macht es so schwer, Abhängigkeitsverhaue zu verändern. Und es<br />
leidet die Wiederverwendbarkeit. Auch die Composability wird schwierig, weil immer und überall<br />
Abhängigkeitsbeziehungen befriedigt werden müssen. Inversion of Control und Dependency Injection<br />
mögen da helfen – sie reduzieren die Zahl der funktionalen Abhängigkeiten jedoch nicht.<br />
Deshalb glaube ich, dass echt agiler Entwurf noch einen Schritt weiter gehen muss. Es muss Kopplung<br />
abschütteln, wo es geht. Das IOSP ist ein Anfang. Doch dazu muss noch das PoMO treten. Operationen<br />
und ihre Klassen müssen so definiert werden, dass sie unabhängig voneinander sind. Dann werden<br />
nämlich die Klassenhierarchien so einfach, wie Abbildung 13 das für das Beispielszenario vormacht.<br />
Darüber hinaus gibt es zwar noch Abhängigkeiten von gemeinsamen Daten – hier wäre zum Beispiel ein<br />
Datentyp für eine Seite zu nennen, der Überschrift und Datenzeilen transportiert –, doch die sind ebenfalls<br />
unkritisch.<br />
Das ist wahrscheinlich fern Ihrer gewohnten Objektorientierung, die erstens darauf abzielt, Daten und<br />
Funktionalität zusammenzulegen und zweitens gern funktionale Kollaborationen zwischen Klassen<br />
herstellt. Doch es ist nicht per se gegen die Objektorientierung gerichtet. Klassen/Objekte haben auch nach<br />
dem agilen Entwurf ihre Berechtigung.<br />
Wenn man den Entwurf des Beispielszenarios weitertreibt, dann bekommen zum Beispiel<br />
Ressourcenzugriff oder Blättern ganz natürlich einen Zustand. Mit dem umzugehen, ist mittels<br />
objektorientierter Mittel einfacher als bei einer puren funktionalen Programmierung.<br />
Es geht bei der Beschreibung eines agilen Entwurfs nicht gegen die Objektorientierung, sondern um einen<br />
Rahmen für sie. Sie soll eingepasst werden, um vom Impedanzunterschied zwischen agilem Vorgehen und<br />
Codierung wegzukommen. Klassen sind ein wunderbares Abstraktionsmittel. Doch Abstraktion bedeutet,<br />
dass es schon ein Muster gibt, das erkannt und mit einer Klasse ausgedrückt werden kann. Das geschieht<br />
beim agilen Entwurf ganz natürlich. Da sind zuerst Interaktionen und Features beziehungsweise<br />
Integrationen und Operationen. Und darin finden sich Gruppen von Funktionseinheiten, die enger<br />
zusammengehören.<br />
Anders beim Vorgehen in objektorientierter Manier mit Class-Responsibility- Collaboration-Kärtchen [9]:<br />
Dort stehen Klassen im Vordergrund und man muss sich mühen, Verantwortlichkeiten darauf zu verteilen.<br />
Solcher gespielter Entwurf ist nicht getrieben durch Inkremente, sondern durch technische Belange oder<br />
eine animistische Sicht, die Software als Gemeinschaft belebter Objekte sieht. Kein Wunder, dass das<br />
Ermahnungen zur Folge hat, Klassen nicht Controller, Manager oder Coordinator zu nennen.<br />
Wie Abbildung 13 zeigt, ist das für agilen Entwurf kein Thema. Klassen entstanden durch Abstraktion von<br />
Funktionseinheiten und bekommen intuitiv andere Namen, die näher an der Domäne sind.<br />
Das übliche objektorientierte Vorgehen, welches zuerst Klassen findet und dann Methoden, ist insofern<br />
eine vorzeitige Optimierung. Hierarchien müssen von unten wachsen (bottom-up), sonst fehlt höheren<br />
Hierarchieebenen die Legitimation.<br />
Ein Dirigent ist kein Selbstzweck, sondern deckt einen Bedarf an Koordination, wenn eine Gruppe von<br />
Musikern eine bestimmte Größe erreicht hat. Genauso ist eine Klasse kein Selbstzweck, sondern es muss<br />
einen Bedarf für sie geben. <strong>Der</strong> jedoch entsteht erst, wenn es eine Gruppe von Funktionen gibt, die davon<br />
profitieren, zusammengefasst zu werden.