Tải bản đầy đủ (.pdf) (30 trang)

Tài liệu PHP – Endlich objektorientiert- P15 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.04 MB, 30 trang )

5 – Projektpraxis
390
Abbildung 5.33: Ein frisch erstellter Bestand
Ausgangspunkt der Betrachtung ist ein gerade angelegter Datenbestand, der nun persis-
tent (also dauerhaft) in der Datenbank untergebracht werden soll. Dieser Datenbestand
ist in Abbildung 5.33 dargestellt. Bei der Erstellung der Menüführung wurde bereits eine
Schaltfläche speichern vorgesehen, die aus der Anwendungsfallbeschreibung unseres
Auftraggebers stammt. Diese Funktion wurde bislang jedoch noch nicht realisiert.
Listing 5.25 beschreibt die Datei speichern.php, die bei einem Klick auf die Schaltfläche
ausgeführt wird. Dabei wird zuerst geprüft, ob sich überhaupt Aktien im Bestand befin-
den. Ist dies nicht der Fall, wird eine entsprechende Meldung ausgegeben.
Andernfalls wird ein neues MySQL-Datenbankzugriffsobjekt erzeugt und eine Parame-
ter-Liste gefüllt, die die Zugangsdaten zum Datenbankserver enthält. Im Anschluss
daran wird eine Verbindung zum Server aufgebaut.
Ist dies erfolgreich, so wird zunächst ein eventuell bestehender Inhalt in der Tabelle ent-
fernt, um den aktuellen Bestand bzw. die aktuellen Bestände abzulegen. Die Anwen-
dung ist also noch nicht dafür geeignet, Bestände mehrerer Benutzer zu verwalten.
In der anschließenden for-Schleife wird die Liste der Aktienbestände durchlaufen und
jeder einzelne Bestand deserialisiert. Dann wird die aktuelle Bilanz des gerade deseriali-
sierten Bestands erstellt, die ja alle notwendigen Informationen enthält. Alle Basisdaten,
die zur Erstellung der Bilanz notwendig sind, werden dann in einem SQL-INSERT-State-
ment verpackt und über ein weiteres Parameterobjekt an die Datenbank gesendet.
War der Schreibvorgang erfolgreich, wird ein Zähler für die erfolgreich archivierten
Bestände hochgesetzt, ansonsten ein Zähler für die nicht erfolgreich archivierten
Bestände. Abschließend werden beide Zähler im Kontext einer HTML-Ausgabe ausge-
geben, sofern sie Werte größer als 0 enthalten.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 391
Die OK-Schaltfläche führt dann wieder auf die Übersicht der Bestände, die in der ueber-
sicht.php aufbereitet werden.


<?php require_once("header.inc.php"); ?>
<center>
<h3>
<?php
if ($_SESSION[BestandAnzahl]<1){
echo 'Es sind KEINE Daten zum Speichern vorhanden!';
}
else{
$db=new mysqlDZ();
$p_öffnen=new ParameterListe();
$p_öffnen->add('host','localhost'); $p_öffnen->add('user','root');
$p_öffnen->add('pass',''); $p_öffnen->add('db','boerse');
if ($db->öffnen($p_öffnen)==FALSE){
echo 'FEHLER beim Öffnen der Datenbank!';
}
else{
$p_schreiben=new ParameterListe();
$p_schreiben->add('sql','TRUNCATE aktien');
$db->schreiben($p_schreiben);
$erfolg=0;
$fehler=0;
for ($i=0;$i<$_SESSION[BestandAnzahl];$i++){
$bestand=unserialize($_SESSION[Bestand][$i]);
$data=$bestand->getBilanz();
$p_schreiben=new ParameterListe();
$sql="INSERT INTO aktien VALUES (";
$sql.=($i+1).",'".$data[Aktienname]."','".$data[AktienISIN].
"','".$data[AktienURL]."'";
$sql.=",".$data[anzahl].",".$data[ekEinzelpreis].
",'".date_format(new DateTime($data[ekDatum]),"Y-m-d").

"',".$data[ekGebühr];
if ($bestand->isVerkauft()){
$sql.=",".$data[aktEinzelpreis].",'".date_format(
new DateTime($data[aktDatum]),"Y-m-d")."',".$data[aktGebühr];
}
else{
$sql.=",0,'0000-00-00',0";
}
$sql.=",".$data[dividenden].")";
$p_schreiben->add('sql',$sql);
if ($db->schreiben($p_schreiben)==FALSE)
$fehler++;
else
Listing 5.25: Speichern der Aktienbestände der PHP-Session
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
392
In unserem Beispiel erfolgt die Meldung, dass ein Datensatz erfolgreich archiviert
wurde.
Abbildung 5.34: Meldung nach erfolgreicher Speicherung
$erfolg++;
}
$db->schliessen();
}
}
if ($erfolg>0){
echo 'Es wurden '.$erfolg.' Datensätze erfolgreich geschrieben.<br>';
}
if ($fehler>0){
echo 'Das Schreiben von '.$fehler.' Datensätzen ist

FEHLGESCHLAGEN.<br>';
}
?>
</h3>
<form action="uebersicht.php" method="post">
<input type="submit" value=" OK "/></form>
</center>
<?php require_once("footer.inc.php"); ?>
Hinweis
Testen Sie einen Fehlerfall, indem Sie den MySQL-Server im XAMPP Control Panel
deaktivieren, bevor Sie auf die Schaltfläche speichern klicken.
Listing 5.25: Speichern der Aktienbestände der PHP-Session (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 393
Den Erfolg können Sie prüfen, indem Sie über phpMyAdmin nochmals die Verwaltung
des Datenbankservers aufrufen und sich dort den Inhalt der Aktientabelle anzeigen las-
sen.
Abbildung 5.35: Inhalt der Datenbanktabelle nach erfolgreicher Speicherung
Im zweiten Teil soll jetzt der bestehende Datenbestand wieder ausgelesen werden. Dazu
werden alle Fenster des Internetbrowsers beim Client geschlossen, um die PHP-Session
zu beenden. Nach einem erneuten Öffnen erscheint dann wieder der in Abbildung 5.36
dargestellte Willkommensbildschirm.
Abbildung 5.36: Willkommensbildschirm nach neuer Session
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
394
Es wurde bereits programmiert, dass die Schaltfläche speichern inaktiv ist, wenn keine
Bestände vorliegen. Statt neue Bestände manuell anzulegen, sollen Sie über die Schalt-
fläche laden auch existierende Bestände aus der Datenbank einlesen können.

Die Funktion der laden.php, die durch das Klicken auf die gleichnamige Schaltfläche aus-
geführt wird, ist in Listing 5.26 beschrieben. Wie schon beim Speichern, wird ein neues
Datenbankzugriffsobjekt erstellt und die Verbindung zur Datenbank über die Angabe
der Parameter host, user, passt und db hergestellt.
Über den SQL-Befehl SELECT * FROM aktien ORDER BY ID werden dann alle Bestände
aus der Datenbanktabelle ausgelesen. Ist dies erfolgreich, so ergibt sich eine mit den
Beständen gefüllte Ergebnismenge $ausgabe. Diese Menge wird in der foreach-Schleife
Datensatz für Datensatz und damit Bestand für Bestand durchgegangen.
Für jeden Bestand wird dann ein Kauforderobjekt erstellt, mit dessen Hilfe ein neues
Bestandsobjekt angelegt wird. Dann werden eventuell gezahlte Dividenden zum
Bestand hinzugefügt. Wurde der Bestand bereits verkauft, so wird anschließend ein Ver-
kaufsorderobjekt erstellt und dem Bestand hinzugefügt. Dies sind dieselben Schritte, die
auch ein Anwender in der Benutzeroberfläche tätigen kann. Es werden dabei dieselben
Methoden der Fachlogik aufgerufen. Die Daten stammen diesmal lediglich aus der
Datenbank und nicht aus gefüllten HTML-Formularen.
Der Bestand wird abschließend in die PHP-Session serialisiert und der Zähler der
Objekte in der Session inkrementiert. Der Benutzer enthält dann als HTML-Antwort die
Anzahl der erfolgreich ausgelesenen Aktienbestände.
<?php require_once("header.inc.php"); ?>
<center>
<h3>
<?php
$db=new mysqlDZ();
$p_öffnen=new ParameterListe();
$p_öffnen->add('host','localhost'); $p_öffnen->add('user','root');
$p_öffnen->add('pass',''); $p_öffnen->add('db','boerse');
if ($db->öffnen($p_öffnen)==FALSE){
echo 'FEHLER beim Öffnen der Datenbank!';
}
else{

$p_lesen=new ParameterListe();
$p_lesen->add('sql','SELECT * FROM aktien ORDER BY ID');
$ausgabe=$db->lesen($p_lesen);
if ($ausgabe==FALSE){
$db->schliessen();
echo 'FEHLER beim Zugriff auf die Datenbank!';
}
Listing 5.26: Laden der Aktienbestände in die PHP-Session
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 395
Abbildung 5.37 zeigt, dass in diesem Beispiel genau ein Bestand ausgelesen wurde, der
auch direkt gewählt wird.
else{
$i=0;
foreach($ausgabe as $index => $data){
$aktie=new Aktie($data[name],$data[isin],$data[url]);
$kauf=new Kauforder($aktie,$data[anzahl],date_format(
new DateTime($data[kaufdatum]),"d.m.Y"),$data[kaufkurs],
$data[kaufgebuehr]);
$bestand=new Aktienbestand($aktie,$kauf,$data[verkaufgebuehr]);
$bestand->addDividende($data[dividenden]);
if ($data[verkaufkurs]>0){
// bereits verkauft
$verkauf=new Verkauforder($aktie,$data[anzahl],date_format(
new DateTime($data[verkaufdatum]),"d.m.Y"),$data[verkaufkurs],
$data[verkaufgebuehr]);
$bestand->addVerkauforder($verkauf);
}
$_SESSION[Bestand][$i]=serialize($bestand);

$i++;
}
// Anzahl der Datensätze
$_SESSION[BestandAnzahl]=count($ausgabe);
if (count($ausgabe)>0){
$_SESSION[BestandGewählt]=0;
echo 'Es wurden '.count($ausgabe).' Aktienbestände geladen.';
}
else{
$_SESSION[BestandGewählt]=-1;
echo 'ACHTUNG: Es wurde KEIN Bestand geladen.';
}
$db->schliessen();
}
}
?>
</h3>
<form action="uebersicht.php" method="post">
<input type="submit" value=" OK "/></form>
</center>
<?php require_once("footer.inc.php"); ?>
Listing 5.26: Laden der Aktienbestände in die PHP-Session (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
396
Abbildung 5.37: Erfolgsmeldung nach erfolgreichem Laden
Der Klick auf die OK-Schaltfläche führt wie immer in die Übersicht, sodass der Benutzer
die Bilanz des aus der Datenbank geladenen Aktienbestands betrachten kann.
Abbildung 5.38: Der geladene Aktienbestand
5.1.5 Die nächsten Schritte

In diesem Kapitel haben Sie bisher erfahren, wie Sie auf der Grundlage einer kurzen
fachlichen, objektorientierten Analyse mit anschließendem technischen Design einen
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 397
PHP-Prototypen erstellen, der über die MySQL-Datenzugriffsschicht und die objektori-
entierte Fachlogik bis hin zu einem Bedieninterface auf Grundlage von HTML-Formula-
ren reicht. Dies entspricht einem Zyklus in der iterativ-inkrementellen Softwareentwick-
lung.
Nachdem Sie das Vorgehen von der Idee unseres Auftraggebers bis hin zu der Fertigstel-
lung dieses Prototyps gelesen und verstanden haben, können Sie Ihre ursprüngliche Ein-
schätzung für den Aufwand dieser Entwicklung mit der tatsächlichen Dauer bzw. mit
den tatsächlichen Kosten vergleichen. Lagen Sie in Ihrer Einschätzung richtig? Hatten
Sie mehr oder weniger Zeit bzw. Kosten vorgesehen? In der Regel kalkuliert man als
Anfänger weniger Zeit bzw. Kosten als tatsächlich benötigt werden.
Wie könnten nun die nächsten Schritte in dem Szenario dieses Entwicklungsprozesses
aussehen? Zunächst einmal ist spätestens nun ein Review durch den Auftraggeber anzu-
setzen mit den folgenden Fragestellungen:

Wurden die realisierten Funktionen fachlich korrekt realisiert?

Wie sind Sie mit der Bedienung zufrieden?

Was wünschen Sie sich als Nächstes für Funktionen?
Auf Basis der Antworten kann eine Kostenabschätzung und eine Priorisierung für die
nächste Iteration vorgenommen werden. Diese bislang realisierten Funktionen können
dem Kunden bereits in Rechnung gestellt werden. Für den Fall, dass Sie den Aufwand
falsch eingeschätzt haben, ist Ihr Risiko bei dieser Vorgehensweise geringer als bei einer
Gesamtabschätzung.
Außerdem könnte ein Refactoring für die bisherige Anwendung erfolgen. Dabei sind

drei Punkte zu diskutieren:
1. Die Klassen Bestand und Bilanz sind sehr eng miteinander verbunden. Es könnte sinn-
voller sein, diese beiden Klassen zu vereinigen.
2. Wenn der Kunde davon ausgeht, dass diese Anwendung noch wesentlich größer
wird, sollte über die Erstellung von Template-Klassen für die Darstellung (View) und
für den Controller nachgedacht werden. Dies führt zu einer verbesserten Wartbarkeit
der Gesamtanwendung an der Benutzerschnittstelle.
3. An vielen Stellen werden Benutzereingaben noch nicht auf Gültigkeit geprüft.
Ebenso ist die Datenbankanbindung idealisiert und kann eine Vielzahl von Fehlern
verursachen. An dieser Stelle kann durch das Erstellen eigener Exception-Klassen ein
Fehlermanagement eingeführt werden, das in die Bedienung integriert wird. Zusätz-
lich dazu könnten Benutzereingaben clientseitig über JavaScript-Prüfroutinen verifi-
ziert werden, noch bevor das HTML-Formular zum Server zurückgesendet wird.
Zusätzlich dazu sind bei der Entwicklung des ersten Prototyps einige Erweiterungsmög-
lichkeiten aufgefallen, die in den nächsten Iterationen realisiert werden könnten. Dies
sind:

Die Erstellung eines Logins mit Benutzernamen und Kennwort sowie eine benutzer-
abhängige Speicherung der Aktienbestände. So hat jeder Aktionär Zugriff auf seine
persönlichen Bestände. Diese Idee hat bereits unser Auftraggeber bei der Analyse
geäußert (Abb. 5.1). Er hat die Umsetzung jedoch damals zurückgestellt.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
398

Die Anbindung eines realen Depots im Onlinebanking. Die PHP-Anwendung würde
dann für den Depotbesitzer einen Mehrwert durch die Bilanzierung darstellen.

Die Integration mehrerer Depots für einen Benutzer. Somit könnten Aktienbestände
gruppiert werden.


Die Funktion, auch Teile eines Bestands zu verkaufen. Die dabei erzielten Gewinne
bzw. Verluste würden dann separat in der Bilanz verwaltet.

Eine grafische Statistik, die eine Historie des Depotwerts anzeigt über einen Tag, eine
Woche, einen Monat und ein Jahr.

Die Verwaltung laufender Depotkosten. Manche Depotanbieter verlangen zusätzlich
zu den Transaktionsgebühren jährliche Gebühren für die Verwaltung eines Depots.
Diese Gebühren reduzieren natürlich den Gewinn und sollten in die Bilanz mit einge-
pflegt werden können.

Die Möglichkeit, einzelne Bestände in die Datenbank zu laden und zu speichern. Bis-
lang ist nur ein Laden und Speichern der gesamten Bestände möglich.
5.2 Erstellung von gutem Quellcode
Abschließend werden in diesem Buch Regeln und Werkzeuge vorgestellt, die bei der
Entwicklung einer PHP-Anwendung behilflich sind und zu einer Verbesserung der Qua-
lität der erstellten Skripte beitragen sollen.
5.2.1 Ein Styleguide für guten Quellcode
Im ersten Schritt werden dabei Regeln für die Erstellung von PHP-Quellcode aufgestellt.
Diese Regeln müssen nicht zwingend eingehalten werden (Sie können auch ohne diese
Regeln lauffähige PHP-Skripte schreiben), jedoch hat die Praxis gezeigt, dass gerade bei
einer größeren Anzahl an Skripten die Wartung und Fehlerkorrektur wesentlich schwie-
riger wird. Dies gilt auch für den Fall, dass sich andere Entwickler in Ihren Quellcode
einarbeiten müssen. Im Folgenden werden 16 „goldene Regeln“ für guten PHP-Quell-
code vorgestellt:
1. Schreiben Sie für jede PHP-Klasse eine Datei, die genauso heißt wie die Klasse selbst.
Dies erleichtert die Übersicht im Dateisystem und ermöglicht die Programmierung
eines automatischen Klassenladers. Dies ist auch bei anderen Sprachen wie Java ver-
Hinweis

Als Übung können Sie den bislang vorgestellten Prototyp realisieren und sich im
Anschluss daran eine oder mehrere der oben skizzierten Funktionen vornehmen.
Schätzen Sie den Aufwand für die Realisierung der Funktionen und binden Sie die
Funktionalität in die Anwendung mit ein. Wie präzise können Sie die Aufwand-
schätzungen vornehmen? Wie nahe liegen Sie an den benötigten Ressourcen der rea-
len Umsetzung?
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Erstellung von gutem Quellcode
PHP – Endlich objektorientiert 399
breitet. Da Klassen immer von anderen Skripten eingebunden werden, sollte die
Dateiendung einer Klasse stets .inc.php lauten.
2. Schreiben sie den ersten Buchstaben des Klassennamens stets groß, sowohl im Datei-
namen als auch in der Klassendefinition. Erstellen Sie also eine Aktie.inc.php mit der
Deklaration class Aktie{...}. Verwenden Sie stets die Singularform bei der Namensge-
bung.
3. Schreiben Sie den ersten Buchstaben von Eigenschaften und Methoden stets klein.
Wenn es sich um ein zusammengesetztes Wort handelt, schreiben Sie zur besseren
Lesbarkeit die ersten Buchstaben der Teilwörter groß, beispielsweise $farbe oder $akti-
enListe für die Bezeichnung der Eigenschaften und berechneGewinn() für eine
Methode.
4. Deklarieren Sie alle Eigenschaften als private zur Datenkapselung und alle Methoden,
die Dienste eines Objekts dieser Klasse darstellen, als public.
5. Schreiben Sie zu jeder Eigenschaft eine entsprechende Get- und Set-Methode. So
gehören in einer Stifteklasse beispielsweise zu der Eigenschaft $farbe die Methoden
getFarbe() und setFarbe($f). Prüfen Sie innerhalb der Set-Methode, ob der übergebene
Wert $f gültig ist und im aktuellen Zustand des Objekts gesetzt werden darf. In der
Get-Methode können Sie eine Formatierung für die Ausgabe vorsehen.
6. Sind Eigenschaften schreibgeschützt, so setzen Sie die Set-Methode private und grei-
fen nur innerhalb der Klasse zu. Dürfen Eigenschaftswerte (z. B. aus Datenschutz-
gründen) nicht ausgelesen werden, so setzen Sie die Get-Methode private.

7. Fragen Sie einen Wahrheitswert ab, so schreiben Sie nicht die Methode getVerkauft(),
sondern isVerkauft(). Dies macht dem Benutzer dieser Klasse, der ja auch ein Pro-
grammierer sein kann, die Handhabung leichter.
8. Wenn Sie einen Wert zu einer kumulierenden Eigenschaft hinzufügen wollen, schrei-
ben Sie nicht setDividende($d), sondern addDividende($d). Dies verdeutlicht, dass
etwas aufaddiert wird und gilt auch für Objekte. Meldet sich ein Student zu einem
Praktikum an, deklarieren Sie im Praktikum die Methode addStudent($s).
9. Schreiben Sie Konstanten immer komplett groß. Trennen Sie zusammengesetzte Wör-
ter in Konstanten stets mit einem Unterstrich. Beispiele sind PI oder MAX_STUDEN-
TEN.
10. Eine Klasse hat prinzipiell den folgenden Aufbau:
̈
(statische) Konstanten
̈
Klasseneigenschaften
̈
Eigenschaften jedes Objekts
̈
Konstruktoren
̈
alle Get- und Set-Methoden der Eigenschaften, jeweils Get und Set zu jeder Eigen-
schaft abwechselnd
̈
alle öffentlichen Dienste bzw. Methoden dieser Klasse
̈
alle privaten Hilfsmethoden
11. Rücken Sie jeden Funktionsblock, z. B. innerhalb einer Klasse, einer Methode, einer if-
Verzweigung oder einer Schleife einheitlich mit zwei Leerzeichen ein.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis

400
12. Klammern Sie Funktionsblöcke stets einheitlich. Dabei hat sich folgendes System
bewährt:
class Test{
$eigenschaft;
methode(){
anweisung;
if ($var==true){
anweisung;
anweisung;
}
}
}
13. Deklarieren Sie PHP-Zeichenketten stets mit einfachen Hochkommata, also
$var=’Hallo’;. Dies beschleunigt die Verarbeitung und ist besonders dann hilfreich,
wenn Sie den Inhalt der Variablen für eine HTML-Ausgabe verwenden wollen. Dort
können Sie dann nämlich doppelte Hochkommata verwenden, ohne mit der PHP-
Deklaration zu kollidieren. Ein Beispiel dafür ist $var=’<table border=“1“>’;.
14. Es gibt prinzipiell zwei Möglichkeiten, HTML-Code in PHP einzubinden. Entweder
beenden Sie den PHP-Block und geben HTML-Code aus, oder Sie geben den HTML-
Code unter Verwendung des PHP-Befehls echo zurück. Die erste Methode hat den
Vorteil, dass Sie HTML-Code direkt aus einem HTML-Bearbeitungsprogramm wie
Microsoft Frontpage oder Macromedia Dreamweaver einbinden können und der
HTML-Code nicht so stark von PHP-Anweisungen durchsetzt wird. Hier sehen Sie
ein Beispiel dazu:
<? php
if ($var==true){
?>
<h1>Hallo</h1>
<p> Herzlich Willkommen auf meiner Homepage</p>

<?php
}
?>
15. Schreiben Sie vor jeder Klasse einen Kommentar, der Informationen zu der Klasse,
ihrem Autor und ggf. Copyrights beinhaltet. Kommentieren Sie vor jeder Methode,
was diese Methode dem Benutzer an Funktionalität anbietet.
16. Trennen Sie Skripte mit Fachlogik von Skripten mit Zugriff auf die Datenbank und
Skripten für die Benutzerinteraktion. Arbeiten Sie strikt nach dem Model-View-Cont-
roller-Prinzip (MVC). Auch wenn dies anfangs unhandlicher erscheint, ergibt diese
Vorgehensweise eine bessere Struktur Ihrer Anwendung. Sie können zur Unterschei-
dung die Namen der Skripte auch entsprechend benennen, z. B. m_xxxx.php für
Zugriffe auf die Datenbank, v_xxxx.php für HTML-Formulare bzw. HTML-Ausgaben
sowie c_xxxx.php für Skripte, die Fachlogikklassen verwenden.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Erstellung von gutem Quellcode
PHP – Endlich objektorientiert 401
5.2.2 Erfolgreiche Codestrukturen – Design Patterns
Neben den Regeln für eine bessere Lesbarkeit des Quellcodes haben sich auch Regeln
gefunden, wie man bestimmte Probleme objektorientiert lösen kann. Ein Design Pattern
(Entwurfsmuster) beschreibt eine bewährte Schablone für ein Entwurfsproblem und
damit eine wieder-verwendbare Vorlage zur Problemlösung.
Der Nutzen eines Design Patterns liegt in der Beschreibung einer Lösung für eine
bestimmte Klasse von Entwurfsproblemen, die einem Entwickler immer wieder über
den Weg laufen. Die Design Patterns wurden erstmals von Erich Gamma, Richard Helm,
Ralph Johnson und John Vlissides in ihrem Buch „Design Patterns – Elements of Reusa-
ble Object-Oriented Software“ erwähnt. Dieses Buch hat einen Standard in der Soft-
waretechnik geschaffen; seine Autoren sind seitdem als „Viererbande“ bzw. „Gang-of-
Four“ bekannt.
Design Patterns werden heutzutage an jeder deutschen Hochschule im Rahmen der
Informatikausbildung gelehrt, damit die Absolventen diese Muster als Anleitung zur

objektorientierten Lösung von typischen Problemstellungen verwenden können.
Die Autoren des Buches klassifizieren ihre Design Patterns nach den beiden Kriterien
des Zwecks und des Anwendungsbereichs, auf den sie wirken.
Nach dem Zweck des jeweiligen Musters unterscheiden sie drei Gruppen. Die erste
Gruppe der Erzeugungsmuster bezieht sich auf die Erzeugung von Objekten. Ein
Anwendungsfall besteht darin, die Anzahl von erzeugten Objekten einer Klasse zu kont-
rollieren oder den konkreten Typ der erzeugten Objekte anzupassen. Die zweite Gruppe
umfasst Strukturmuster, die eine Vereinfachung der Struktur zwischen Klassen ermögli-
chen sollen. Komplexe Beziehungen können unter anderem über vermittelnde Klassen
oder Schnittstellen vereinfacht werden. Die dritte Gruppe der Verhaltensmuster betrifft
das Verhalten der Klassen, die sich auf die Zusammenarbeit und den Nachrichtenaus-
tausch von Klassen beziehen.
Nach ihrem Anwendungsbereich lassen sich Muster in zwei Gruppen einteilen. So
beschreiben klassenbasierte Muster Beziehungen zwischen Klassen und bauen beispiels-
weise Vererbungsstrukturen auf. Im Gegensatz dazu nutzen objektbasierte Muster
zumeist Assoziationen und Aggregationen zur Beschreibung von Beziehungen zwi-
schen Objekten.
Abbildung 5.39 verdeutlicht die Unterteilung der Design Patterns. Seit ihrer Entdeckung
wurden unzählige Design Patterns gemäß dieser Unterteilung von Softwaretechnikern
erfunden und veröffentlicht und es wurden einige Bücher zu dieser Thematik geschrie-
ben. Die ursprünglichen Muster der Viererbande haben jedoch als Einzige weltweit Ver-
breitung und Anerkennung gefunden.
Da es sich bei diesem Buch nicht um ein reines Buch zu Design Patterns handelt, die
Design Patterns jedoch in der objektorientierten Entwicklung eine große Bedeutung
haben, werden die bekanntesten Vertreter jeder Kategorie im Folgenden vorgestellt.
Dabei wird die Problemstellung und der Lösungsansatz jeweils kurz beschrieben, den
das entsprechende Design Pattern bietet. Zusätzlich werden UML-Diagramme gezeigt,
die den Lösungsansatz genauer beschreiben. Da Sie im dritten Kapitel die UML-Syntax
kennengelernt haben und im vierten Kapitel dieses Buches erfahren haben, wie man die
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.

×