Design-Patterns
Die Entwicklung von Software-Komponenten in den vergangenen 30 Jahren hat immer wieder gezeigt,
dass sich spezielle Probleme in unterschiedlichen Bereichen von Projekt zu Projekt wiederholen.
Der Grund hierfür ist, dass sich Softwaresysteme von ihrer Grundarchitektur her stark ähneln.
So hat beispielsweise jedes System eine grafische Oberfläche, um mit dem Benutzer zu interagieren.
Weiterhin besteht bei fast jeder Anwendung die Notwendigkeit, auf einen dauerhaften Datenbestand
zuzugreifen. Der Zugriff auf die Datenschicht wird häufig an mehreren Stellen in der Anwendung
(oder sogar von verschiedenen Anwendungen) benötigt. All diese Anforderungen veranlassen
Entwicklungsteams dazu, sich schon im Vorfeld Gedanken zum Aufbau des Gesamtsystems zu machen.
Dieser Aufbau wird als die eigentliche Software-Architektur bezeichnet. Diese bildet die Basis,
auf der jede weitere Funktionalität beruht. Darüber hinaus definiert eine sinnvoll konzipierte
Architektur ein Vorgehen für in Zukunft zu erstellende Komponenten der Anwendung.
Dies ist schon deshalb sehr wichtig, da bei großen Projekten häufig, heutzutage u. a. bedingt
durch die Globalisierung und die steigende Nachfrage nach guten Entwicklern, eine gewisse
Fluktuation in Entwicklerteams herrscht.
Vorteil von Design-Patterns
Eine "geradlinige", d.h. eine sinnvoll strukturierte und gut nachvollziehbare Architektur
ermöglicht es neuen Teammitgliedern, schnell in das bestehende System einzusteigen und effektiv
an der Weiterentwicklung mitzuwirken. Eine "schlechte", also unübersichtliche Architektur dagegen
führt zu Missverständnissen bei den Beteiligten, im schlimmsten Fall zu einem Chaos, das hohe
Kosten verursachen kann. Eine weitere Gefahr besteht darin, später eine eigentlich "gute"
Architektur zu verändern, diese Änderung aber nicht bis zu Ende durchzuführen. Oftmals wird
in der Praxis dafür Zeitdruck als Ausrede benutzt. Beobachtungen zeigen jedoch, dass hierfür
ebenso oft mangelnde Motivation der Entwickler verantwortlich ist.
Angesichts der hier dargelegten Befunde liegt es nahe, von vornherein die bei der Entwicklung
eines Softwaresystems auftretenden Probleme zu beschreiben, nach Standard-Lösungsansätzen zu
suchen und diese in einem projektübergreifenden "Best-Practice-Katalog" festzuhalten.
Eric Gamma
Erich Gamma war einer der ersten Entwickler, die erkannten, dass es bei der Entwicklung von
Softwarekomponenten neben der syntaktischen Grammatik weitere Regeln gibt. Aufgrund seiner
Projekterfahrung war es Gamma möglich, sogenannte Patterns für immer wieder auftretende
Anforderungen zu definieren.
In seinem 1997 publizierten Buch "Design-Patterns" hat er die ihm bekannten 17 Muster in die
Kategorien "Verhalten", "Ablauf" und "Struktur" eingeteilt.
Diese von Gamma definierten Muster haben bis heute einen enorm hohen Stellenwert bei Architekten
und Entwicklern. Ist es einem Team möglich, sich anhand von Mustern zu verständigen, können Kosten
für überflüssige Erklärungsiterationen gespart und somit früher mit der Implementierung begonnen
werden. Neue Teammitglieder sind mit den eingesetzten Mustern vertraut und finden sich schnell
im Programmcode zurecht. Aufgrund der Tatsache, dass die eingesetzten Muster seit Jahren erprobt
sind, ist die Gefahr gering, in eine "architektonische Falle" zu geraten.
Bei der Entwicklung von J2EE-Webanwendungen wird, wie in Kapitel 2 beschrieben, ein Grundgerüst
durch die von Sun definierte Servlet-Spezifikation bereitgestellt. Diese nimmt dem Entwickler
jedoch nicht die Entscheidung ab, wie er seine Klassen benennen bzw. aufteilen soll.
Zwar sind sich die meisten Entwickler darüber bewusst, dass Programme auf Dauer nur pflegbar
sind, wenn sie die Regeln der Kohäsion1 sowie der losen Kopplung2 befolgen, jedoch steigt die
Komplexität mit den Anforderungen im Projekt selbst. Mit wachsender Anzahl der Klassen und
Pakete wird es, gerade für unerfahrene Entwickler, immer schwieriger, den Überblick zu
behalten und neue Anforderungen der Grundarchitektur entsprechend umzusetzen.
Um Entwickler auch bei umfangreichen J2EE-Anwendungen zu unterstützen, kann das
Model-View-Controller-(MVC-)Pattern eingesetzt werden. Dieses beinhaltet wiederum
weitere Patterns und fasst sie zu einem großen, allgemein für J2EE-Anwendungen
definierten Muster zusammen.
In den folgenden Unterkapiteln wird das Framework Struts2 vorgestellt und anhand der
Struktur einer J2EE-Anwendung beschrieben. Dieses Framework ist insofern exemplarisch
für die Fragestellung dieser Arbeit, als das es eine Implementierung des MVC-Patterns
ist und sich in den vergangenen fünf Jahren als das am weitesten verbreitete Mainstream-Framework
für J2EE-Anwendungen herauskristallisiert hat. Zunächst wird aber auf das MVC-Modell eingegangen,
um ein Basisverständnis zu verschaffen.
Head-First macht fantastische Bücher. Dieser Buchtip hat mich selbst weitergebracht: