10
Kapitel 3 Muster beim Softwareentwurf 3.1 Einsatz von Mustern 3.2 Eigenschaften von Mustern und ihre Konstruktion 3.3 Abgrenzung zwischen Architekturmustern, Entwurfsmustern und Idiomen 3.4 Schema für die Beschreibung von Entwurfs- und Architek- turmustern 3.5 Zusammenfassung 3.6 Aufgaben J. Goll, M. Dausmann, Architektur- und Entwurfsmuster der Softwaretechnik, DOI 10.1007/978-3-8348-2432-5_3, © Springer Fachmedien Wiesbaden 2013

Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

  • Upload
    manfred

  • View
    220

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

Kapitel 3

Muster beim Softwareentwurf

3.1 Einsatz von Mustern 3.2 Eigenschaften von Mustern und ihre Konstruktion 3.3 Abgrenzung zwischen Architekturmustern, Entwurfsmustern

und Idiomen 3.4 Schema für die Beschreibung von Entwurfs- und Architek-

turmustern 3.5 Zusammenfassung 3.6 Aufgaben

J. Goll, M. Dausmann, Architektur- und Entwurfsmuster der Softwaretechnik, DOI 10.1007/978-3-8348-2432-5_3, © Springer Fachmedien Wiesbaden 2013

Page 2: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

3 Muster beim Softwareentwurf In der Softwareentwicklung gibt es praktisch für alle Entwicklungsschritte Muster: Mus-ter für die Analyse, für den Entwurf, für die Implementierung und für das Testen. Aber auch für speziellere Aufgaben existieren Muster wie etwa für den Entwurf grafischer Oberflächen oder für den Umgang mit Datenbanken. Dieses Buch konzentriert sich auf Muster beim Softwareentwurf. Hierbei unterscheidet man – je nach Granularität – zwischen:

Architekturmustern (engl. architectural patterns) und Entwurfsmustern (engl. design patterns).

Eine Abgrenzung von Architektur- und Entwurfsmustern erfolgt in Kapitel 3.3.

Muster für den Entwurf sind bewährte Lösungsvorschläge für be-stimmte Problemstellungen, die beim Entwurf von Systemen be-achtet werden sollten, da sie sich bereits in mehreren Systemen bewährt haben.

Der Ursprung der Muster beim Entwurf geht auf den Architekten Christopher Alexan-der37 zurück. Er hatte in den 70er Jahren eine Sammlung von Mustern für den Städte-bau zusammengestellt. Christopher Alexander erkannte, dass Gebäude oder auch ganze Straßenzüge zwar dieselben Elemente enthalten können, dennoch aber nach einem ganz anderen Muster aufgebaut sein können. Mit anderen Worten, er identifi-zierte Muster durch Elemente und ihre typischen Beziehungen:

". . . beyond its elements, each building is defined by certain patterns of relationships among the elements . . . " [Ale77]

In der städtebaulichen Architektur ist diese bahnbrechende Idee der Muster allerdings bis heute bei weitem nicht so verbreitet und anerkannt, wie sie es in der Softwareent-wicklung ist. Muster beim Entwurf stellen einen wesentlichen Beitrag dar, die Softwareentwicklung auf ihrem Weg zur ausgereiften Ingenieurwissenschaft ein gutes Stück voranzubrin-gen. Muster sind grundsätzlich plattformunabhängig und nicht auf eine bestimmte Pro-grammiersprache beschränkt. Die Namen der Muster erweitern die Fachsprache und erlauben es geschulten Entwicklern, sich auf einem hohen Abstraktionsniveau über ein Problem und seine Lösung verständigen zu können.

37 Christopher Alexander ist Architekt und Städteplaner. Er erhielt 1963 eine Professur für Architektur an der University of California in Berkley und wurde Direktor des Center for Environment Structure.

Page 3: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

Muster beim Softwareentwurf 65

Ein Muster arbeitet oft mit Abstraktionen, sei es in der Notation ei-ner abstrakten Klasse oder einer Schnittstelle. Die echten Klas-sen sind dann abgeleitete Klassen. Sie sind dem Muster nicht be-kannt. Sie werden vom Nutzer des Musters definiert. Sie treten dann entweder zur Kompilierzeit bei konkreten klassenbasierten Mustern oder zur Laufzeit bei objektorientierten Mustern an die Stelle der Abstraktionen des Musters.

Um Muster anderen Entwicklern zugänglich zu machen, müssen diese dokumentiert werden. Muster werden nicht erfunden, sondern in Anwendungen als Lösungen für typische Probleme und Sachverhalte "entdeckt", auf Konferenzen vorgetragen und dann von der Fachwelt akzeptiert oder auch nicht. Sie können für viele Anwendungen eingesetzt werden. Kapitel 3.1 befasst sich mit dem Einsatz von Mustern beim Softwareentwurf. Kapitel 3.2 beschreibt die Eigenschaften von Mustern beim Softwareentwurf und ihre Kon-struktion. Kapitel 3.3 grenzt Architektur-, Entwurfsmuster und Idiome voneinander ab. In Kapitel 3.4 wird das Schema vorgestellt, das in diesem Buch verwendet wird, um die Muster zu dokumentieren.

3.1 Einsatz von Mustern

Das Hauptziel von Mustern für den Softwareentwurf ist es, einmal gewonnene Erkenntnisse wiederverwendbar zu machen und durch ihre Anwendung die Flexibilität einer Architektur zu erhö-hen.

Die meisten Systementwürfe enthalten zahlreiche Muster, wobei diese Tatsache allein noch kein Merkmal eines guten Entwurfs ist. Auch hier hat Christopher Alexander [Ale77] die passenden Worte gefunden: "Es ist möglich, Gebäude durch das lose Anei-nanderreihen von Mustern zu bauen. Ein so konstruiertes Gebäude stellt eine An-sammlung von Mustern dar. Es besitzt keinen inneren Zusammenhalt. Es hat keine wirkliche Substanz. Es ist aber auch möglich, Muster so zusammenzufügen, dass sich viele Muster innerhalb desselben Raums überlagern. Das Gebäude besitzt einen inne-ren Zusammenhalt; es besitzt viele Bedeutungen, auf kleinem Raum zusammenge-fasst. Durch diesen Zusammenhalt gewinnt es an Substanz." Ein guter Entwurf ent-steht also oft erst dann, wenn mehrere Muster untereinander und mit der Anwendung so geschickt verknüpft werden, dass Synergieeffekte entstehen.

Vorsicht!

Ein Muster sollte nur dann angewendet werden, wenn es tatsäch-lich sinnvoll ist und auch Vorteile bringt. Bevor ein Muster einge-setzt wird, sollte man sich also sehr genau überlegen, ob dieses Muster überhaupt zum Problem passt und welche Konsequenzen sich aus der Anwendung des Musters ergeben.

Page 4: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

66 Kapitel 3- Aus Entwicklersicht bieten Muster eine gewisse Sicherheit. Diese Sicherheit beruht auf der Tatsache, dass die Lösung, die man verwenden will, sich in der Vergangenheit be-reits bewährt hat. Dies führt im Allgemeinen jedoch zu dem Trugschluss, dass das Anwenden von Mustern in jedem Fall die richtige Entscheidung ist. Diese Annahme ist jedoch falsch. Das reine Anwenden von Mustern garantiert einem Entwickler nicht, dass das Muster für sein konkretes Entwurfsproblem sinnvoll ist. Bei objektbasierten Mustern spielt das Delegationsprinzip oft eine wichtige Rolle. Hierbei delegiert das Objekt, das eine Nachricht empfängt, diese im Idealfall weiter. Die Weiterleitung erfolgt

an ein vom empfangenden Objekt aggregiertes Teil-Objekt oder aber an ein Objekt, das zur Laufzeit die konkrete Implementierung einer Abstraktion

(Schnittstelle bzw. abstrakten Klasse) ist, wobei die Abstraktion von der Klasse des empfangenden Objekts implementiert wird.

Vorsicht!

Es ist vollkommen klar, dass jegliche Form der Delegation und Abstraktion Performance kostet. Zusätzliche Schichten sind im-mer mit einer Verringerung der Performance eines Systems ver-bunden.

Wenn man Erweiterbarkeit anstrebt, lohnen sich Muster. Man muss sich aber den Ein-satz von Mustern äußerst gründlich überlegen, wenn eine hohe Performance im Vor-dergrund steht und die Änderbarkeit keine Rolle spielt. Obwohl der Einsatz von Mustern die Erweiterbarkeit einer Architektur erhöht, steigt meist auch gleichzeitig die Komplexität der Architektur.

Vorsicht!

Zur Gewährleistung der Erweiterbarkeit können neue Klassen und Operationen entstehen und damit auch neue Beziehungen zwischen den Klassen. Diese Komplexität führt zu einer Leis-tungsminderung des Systems, die unter Umständen nicht durch die gewonnene Flexibilität aufgewogen wird.

Dies ist vor allem der Fall, wenn diese Flexibilität spekulativ ist, d. h., wenn es unklar ist, ob sie später überhaupt jemals gebraucht wird oder nicht. Es gilt der Grundsatz: "So viel Flexibilität wie nötig, so wenig wie möglich!" In Büchern über Muster ist die Lösung oft der Kern der Darstellung. Das Problem selbst jedoch, d. h., wann die Muster geeignet sind, wird in solchen Fällen zwar aufge-führt, oft jedoch leicht unterschätzt. Unter Umständen führt sogar keines der bekann-ten Muster zum gewünschten Ziel. Ist man auf der Suche nach einer Lösung für ein konkretes Entwurfsproblem, kann es schwierig sein, das richtige Muster zu finden. Man muss das zu lösende Problem stu-dieren und dann die Leistungen der eventuell in Frage kommenden Muster verglei-chen.

Page 5: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

Muster beim Softwareentwurf 67 3.2 Eigenschaften von Mustern und ihre Konstruktion Muster haben das Ziel, die Eigenschaften von Architekturen zu verbessern. Hierzu ge-hören beispielsweise die folgenden Eigenschaften:

Verständlichkeit und Erweiterbarkeit.

Verständlichkeit wird erreicht durch Einfachheit und indem jedes Muster einfach und in strukturierter Weise umfassend dokumentiert wird. Erweiterungen können beispiels-weise

durch statische Vererbung oder über die Verwendung einer aggregierten Schnittstelle38 bzw. einer abstrakten Klas-

se als Abstraktion

erfolgen.

Objektorientierte Muster genügen den folgenden Konstruktions-prinzipien:

loosely coupled system (siehe Kapitel 1.5) – lose Kopplung von Komponenten,

Abstraktion (siehe Kapitel 1.2) – durch Generalisierung und durch Ausweisen von Schnittstellen oder abstrakten Klassen,

Information Hiding (siehe Kapitel 1.2) durch Verbergen der Implementierung,

klare Verantwortlichkeiten (siehe Kapitel 1.3) durch eine Ausweisung von Rollen und

dem Dependency Inversion-Prinzip, wobei eine Klasse einer höheren Ebene nicht von einer Klasse einer tieferen Ebene ab-hängt.

Es soll an dieser Stelle betont werden, dass es möglich ist, Muster für nicht objektori-entierte Systeme zu formulieren. Diese Muster kommen also insbesondere ohne Ver-erbung und Polymorphie aus [Bus98, S. 24]. Muster müssen nicht grundsätzlich ob-jektorientiert sein. Die in diesem Buch vorgestellten Entwurfsmuster werden alle in ei-ner objektorientierten Fassung vorgestellt. Wer objektorientiert denkt, versucht stets durch Generalisierung die höchstmögliche Abstraktion – in anderen Worten die Basisklasse – zu finden, um daraus durch Spe-zialisierung die verschiedenen Varianten zu gewinnen.

38 Siehe beispielsweise das Brücke-Muster.

Page 6: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

68 Kapitel 3- Einige Beispiele der Muster sind aus diesem Grund mit abstrakten Basisklassen ent-worfen, andere jedoch mit Schnittstellen. Vom Grundsatz her gilt, dass Schnittstellen meist vorzuziehen sind. Das hat zwei Gründe:

1. Bei Schnittstellen ist in einigen Programmiersprachen wie z. B. bei Java eine Mehr-fachvererbung erlaubt im Gegensatz zu abstrakten Basisklassen.

2. Während abstrakte Basisklassen neben abstrakten Operationen auch fertige Opera-tionen enthalten können, sind Schnittstellen übersichtlicher. Sie enthalten nur ab-strakte Operationen.

Dass eine Schnittstelle einer abstrakten Klasse vorzuziehen ist, gilt jedoch nicht im-mer. Es wäre kontraproduktiv, wenn man beispielsweise eine Aggregation oder aber eine Default-Implementierung in jeder Implementierungsklasse realisieren müsste. Hier ist eine abstrakte Klasse vorzuziehen.

3.3 Abgrenzung zwischen Architekturmustern, Entwurfsmustern und Idiomen

Beim Entwurf eines Systems werden Architekturmuster, Entwurfsmuster und Idiome unterschieden:

Bild 3-1 Muster bei der SW-Entwicklung Die einzelnen Muster unterscheiden sich vor allem im Abstraktionsgrad. Bei Architek-turmustern betrachtet man die Architektur eines Systems, bei Entwurfsmustern in der Regel ein bestimmtes Problem innerhalb eines Subsystems. Ein Entwurfsmuster beeinflusst in der Regel nicht die grundsätzliche Architektur des Systems. Ein Idiom ist in diesem Zusammenhang ein Muster in einer bestimmten Programmiersprache wie z. B. ein ausprogrammiertes Entwurfsmuster39. Die Architektur eines Systems kann mehrere Architekturmuster enthalten, z. B. eine Schichtenarchitektur (engl. Layers) für die Anwendungssoftware verschiedener Rech-nertypen wie Client- und Server-Rechner oder das Architekturmuster Model-View-Controller (MVC) zur Trennung der Darstellung und der interaktiven Eingabe der Mensch-Maschine-Schnittstelle von dem Daten haltenden und verarbeitenden Model. Ein Architekturmuster wiederum kann – muss es aber nicht – zahlreiche Entwurfs-

39 Auf die Möglichkeit weiterer Ausprägungen von Idiomen soll an dieser Stelle nicht eingegangen wer-den.

Architekturmuster

Idiome

Entwurfsmuster

Page 7: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

Muster beim Softwareentwurf 69 muster enthalten. So enthält beispielsweise das Architekturmuster einer Schich-tenarchitektur (Layers) keine weiteren Entwurfsmuster. Das Architekturmuster MVC hingegen kann beispielsweise das Entwurfsmuster Beobachter, das Kompositum-Muster und das Strategie-Muster enthalten. Entwurfsmuster werden als bewährte Konstruktionsprinzipien im Kleinen eingesetzt. Man spricht auch von Mikroarchitekturen. Die Strukturen und Mechanismen der Entwurfsmuster bestimmen die Zerlegung eines Subsystems in Teile und deren Zusammenarbeit und greifen damit tief in ein Teilsys-tem ein.

In der objektorientierten Softwareentwicklung sind Entwurfsmus-ter Klassen in Rollen, die zusammenarbeiten, um gemeinsam eine bestimmte Aufgabe zu lösen.

Einige Autoren unterscheiden nicht zwischen Entwurfsmustern und Architekturmus-tern. Eigentlich wird ja auch die Architektur eines Systems beim Entwurf festgelegt. In-sofern ist es also durchaus berechtigt, auch die Architekturmuster als Entwurfsmuster zu bezeichnen. Beispielsweise wird in [Eil07] das MVC-Muster zu den Entwurfsmus-tern gezählt. In dem vorliegenden Buch wird zwischen Architektur- und Entwurfsmus-tern unterschieden. Kapitel 4 enthält Entwurfsmuster und Kapitel 5 Architekturmuster.

Entwurfsmuster stellen feinkörnige Muster dar, während Ar-chitekturmuster grobkörnige Muster sind.

Die Idee der Verwendung von Entwurfsmustern in der Softwareentwicklung wurde erstmals 1987 von Kent Beck und Ward Cunningham für die Erstellung von grafischen Benutzerschnittstellen in Smalltalk aufgegriffen und angewandt. Es gibt mittlerweile ei-ne ganze Reihe unterschiedlichster Entwurfsmuster, die in zahlreichen Büchern katalo-gisiert sind. Eine generelle Übertragung der Entwurfsmuster auf die Softwareentwick-lung erfolgte durch die Promotion von Erich Gamma. Das Buch "Design Patterns – Elements of Reusable Object-Oriented Software" [Gam95] der sogenannten "Gang of Four"40 (GoF) führte zum flächendeckenden Einsatz der Entwurfsmuster in der Soft-wareentwicklung. Dieses Buch enthält einen Katalog von 23 Entwurfsmustern, die nach Gamma [Gam95] in die drei Kategorien Strukturmuster, Verhaltensmuster und Erzeugungsmuster eingeteilt werden. Nachfolgend zum GoF-Buch entstanden zahl-reiche weitere Bücher, die auf diesem Werk aufbauen und dabei neue Entwurfsmuster behandelten. Beispielhaft soll hier das Buch "Pattern-orientierte Software-Architektur: Ein Pattern-System" von Frank Buschmann et al. [Bus98] genannt werden. Einen erschöpfenden Katalog von Entwurfsmustern wird es wahrscheinlich nie geben, denn es entstehen ständig neue Muster. Auch sind viele bereits unbewusst ange-wandte Muster noch unbenannt.

40 Die "Gang of Four" sind Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides. Diese Bezeichnung wurde den vier Autoren scherzhaft zugewiesen und ist ohne großen Widerspruch von ihnen angenommen worden.

Page 8: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

70 Kapitel 3- 3.4 Schema für die Beschreibung von Entwurfs- und

Architekturmustern In den folgenden Kapiteln werden Entwurfs- und Architekturmuster nach dem hier für Entwurfsmuster aufgeführten Schema vorgestellt:41

1. Name/Alternative Namen Der Name eines Entwurfsmusters hat eine wichtige Funktion. Er versucht, das Pro-blem, die Lösung und die Konsequenzen in einem oder in zwei Wörtern zusammen-zufassen. Von den meisten Entwurfsmuster-Autoren wird die Namensfindung als der schwierigste Teil eines Entwurfsmusters genannt. Der Name sollte mit größter Sorgfalt und Weitblick gewählt werden. Der Name geht in das Vokabular von Soft-wareentwicklern über und hilft ihnen, einen Entwurf auf einem höheren Abstrak-tionsniveau zu beschreiben.

2. Problem Hier wird beschrieben, welches Problem durch die Anwendung des Musters gelöst werden soll.

3. Lösung Die Beschreibung der Lösung enthält im Falle von Entwurfsmustern die an der Lö-sung beteiligten Klassen, Schnittstellen und Objekte sowie deren Rollen, Bezie-hungen, Zuständigkeiten und Interaktionen. Der Kern der Lösung des abstrakten Entwurfsproblems wird gezeigt. Durch diese abstrakte Sicht bilden Muster eine ideale Kommunikationsbasis für Entwickler. Zur Lösung gehören folgende Ab-schnitte:

Teilnehmer – Rollenbeschreibung der Klassen, Klassendiagramm – Klassendiagramm mit Beschreibung der wechselseitigen

statischen Beziehungen (Statik), Dynamisches Verhalten – Sequenzdiagramm mit Beschreibung der einzelnen

Schritte (Dynamik), Programmbeispiel42

Entwurfsmuster versteht man tatsächlich oft am besten durch Code-Beispiele, auch wenn die Struktur und das Verhalten der Objekte durch ein Klassendia-gramm und ein Sequenzdiagramm visualisiert werden.

4. Bewertung Wird ein Entwurfsmuster eingesetzt, so ergeben sich zwangsweise mehr oder weni-ger offensichtliche Konsequenzen für die Anwendung. Eine genaue Beschreibung der Vor- und Nachteile eines Entwurfsmusters ist dabei von größter Wichtigkeit, um Lösungsalternativen sorgfältig abwägen zu können. Vor- und Nachteile werden in den Abschnitten

Vorteile und Nachteile

41 Bei Architekturmustern kann jedoch noch hinzukommen, welche Entwurfsmuster vom Architektur-muster verwendet werden und für welchen Zweck.

42 Für Architekturmuster gibt es in diesem Buch aus Platzgründen nicht immer sinnvolle Beispiele, da sinnvolle Beispiele den Rahmen des Buches sprengen würden. Manche Beispiele werden im Buch nur verkürzt präsentiert und sind dann vollständig auf dem begleitenden Webauftritt zu finden.

Page 9: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

Muster beim Softwareentwurf 71

dargestellt. Es werden dabei häufig die Auswirkungen eines Entwurfsmusters auf Speicherverbrauch und Performance betrachtet sowie Folgen für die Komplexität und die Erweiterbarkeit des Entwurfs.

5. Einsatzgebiete Bei den Einsatzgebieten können Anwendungsbeispiele optional in einem eigenen Abschnitt aufgeführt werden.

6. Ähnliche Muster Hier werden Gemeinsamkeiten mit ähnlichen Mustern und Unterschiede zu ähn-lichen Mustern beschrieben.

3.5 Zusammenfassung Entwurfs- und Architekturmuster sind bewährte Muster, die beim Entwurf von Syste-men zur Kenntnis genommen werden sollten, da sie Lösungsvorschläge für bestimmte Problemstellungen sind, die sich bereits in mehreren Systemen bewährt haben. Sie stehen als "Blaupausen" zur Verfügung und werden von Hand ausprogrammiert, es sei denn, sie werden bereits durch komfortable Entwicklungswerkzeuge mit den erfor-derlichen Methodenköpfen zur Verfügung gestellt. Muster sind also nicht etwa wiederverwendbarer Quellcode, der in einer Anwendung einfach übernommen werden kann, sondern Muster sind vielmehr weitergereichte Er-fahrungen im Entwurf. Muster sind erprobt und dokumentiert und haben sich in mehre-ren Systemen bei einer vorgegebenen Problemstellung als Bauplan beim Entwurf ei-ner Architektur bewährt. Die konkrete Implementierung von Mustern bleibt jedoch den Entwicklern selbst überlassen. Kapitel 3.1 befasst sich mit der Fragestellung, wie man Muster beim Entwurf einsetzen soll. Kapitel 3.2 betrachtet wesentliche Eigenschaften von Mustern, nämlich die Verständ-lichkeit und Erweiterbarkeit, und ihre Konstruktion. Kapitel 3.3 grenzt Architekturmuster, Entwurfsmuster und Idiome gegenseitig ab. Kapitel 3.4 stellt das in diesem Buch verwendete Schema zur Beschreibung von Mus-tern vor.

Page 10: Architektur- und Entwurfsmuster der Softwaretechnik || Muster beim Softwareentwurf

72 Kapitel 3-

3.6 Aufgaben Aufgaben 3.6.1: Allgemeine Aufgaben

3.6.1.1 Erklären Sie den Zusammenhang zwischen Architekturmustern, Ent-wurfsmustern und Idiomen.

3.6.1.2 Muss ein Architektur- oder Entwurfsmuster objektorientiert sein? Aufgaben 3.6.2: Entwurfsmuster

3.6.2.1 Was ist das Ziel der Entwurfsmuster? 3.6.2.2 Wie entsteht ein Entwurfsmuster? 3.6.2.3 Was sind Mikroarchitekturen? 3.6.2.4 Kann man sich sicher sein, dass man eine gute Architektur erstellt hat,

wenn sie viele Entwurfsmuster enthält?