15.01.2015 Aufrufe

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!