Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Grundlagen der Programmierung: Entwurfsmuster

Komplexe Schnittstellen vereinfachen: Fassade (Facade)

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Bereits einfache Systeme oder Teilsysteme können umfangreiche oder kompliziert zu benutzende Schnittstellen haben. Dem Objekt, das dieses System verwenden möchte, wird dadurch einiges abverlangt – eine "Fassade" kann den Aufwand signifikant verringern.
07:12

Transkript

In diesem Video möchte ich Ihnen ein Entwurfsmuster vorstellen, das Sie praktisch in jedem Ihrer Projekte einsetzen können, die Fassade. Die Problemstellung, die nämlich mit diesem Muster angegangen wird, ist eine sehr verbreitete. Wir haben ein komplexes System oder Teilsystem, das vom Client umfangreiches Wissen über die Struktur des Systems und dessen interne Abläufe verlangt. Dadurch dass der Client mit all diesen Systemen selbst kommunizieren muss, führen natürlich Änderungen an diesen Systemen in der Regel auch zu Änderungen an den Client, die teilweise sehr umfangreich sein können. Schauen wir uns dazu ein Beispiel an und zwar ein Shopsystem. Kunden können dort Bestellungen aufgeben. Die Verarbeitung solcher Bestellungen besteht in der Regel aus vielen Einzelschritten und dafür muss mit unterschiedlichen Teilsystemen kommuniziert werden und das obendrein auch noch in einer bestimmten Reihenfolge. Ich habe hier einen exemplarischen Ablauf einer solchen Bestellungsausführung zusammengestellt. Zuerst muss bei der Rechnungsstelle nachgefragt werden, ob noch offene Rechnungen vorhanden sind. Denn nur, wenn der Kunde alle bisherigen Rechnungen bezahlt hat, darf er auch weiter bestellen. Hat die Rechnungsstelle ihr Ok gegeben, dann gehen wir zur Lagerhaltung und überprüfen den Vorrat. Wir müssen herausfinden, ob das, was der Client bestellen möchte, auch tatsächlich vorhanden ist. Hat auch das geklappt, dann gehen wir zum Lieferdienst und beauftragen den Versand. Könnten wir nun den Lieferdienst erfolgreich dazu bewegen den Versand auch tatsächlich durchzuführen, dann müssen wir zurück zur Lagerhaltung gehen und dafür sorgen, dass das Lager entsprechend aufgefüllt wird. Nun muss natürlich für diese Bestellung auch irgendwie bezahlt werden. Das heißt, wird gehen nochmal zurück zur Rechnungsstelle und sorgen dafür, dass der Bezahlvorgang entsprechend abgewickelt wird und schließlich, wenn das alles erfolgreich war, dann müssen wir noch zu einem weiteren Teilsystem gehen, nämlich zum E-Mail-System und dem Besteller eine Bestätigungs-E-Mail schicken. Vielen Dank für Ihre Bestellung. Beehren Sie uns bald wieder. Das ist jetzt natürlich ein stark vereinfachter Ablauf. Aber ich denke, auch hier ist eine gewisse Komplexität bereits zu erkennen. An der Ausführung einer solchen Bestellung sind also vier Teilsysteme beteiligt. Das E-Mail-System, die Rechnungsstelle, die Lagerhaltung und ein Lieferdienst. Auf der anderen Seite haben wir den Client, der jetzt mit diesen Systemen kommunizieren soll. Client bedeutet hier im weitesten Sinne irgendetwas, was den Bestellvorgang durchführen kann. Ein Kunde könnte zum Beispiel in einem Call Center anrufen und der Call Center Mitarbeiter hat dann auf seinen Monitor eine grafische Oberfläche, über die er den Bestellvorgang steuern kann. Ein Client könnte auch eine Web-Seite im Browser sein, über die der Kunde selbst den Bestellvorgang auslöst. Auch eine Mobile App könnte als Client auftreten, die der Kunde von seinem Mobiltelefon aus nutzen kann. Selbst irgendeine Art von Sprachsteuerungssystem wäre auch denkbar. Das heißt, Client ist hier als Oberbegriff zu verstehen, der verschiedenste Arten von Nutzern unseres Systems zusammenfasst. Dieser Client muss nun also mit all diesen Teilsystemen kommunizieren und nicht nur das, er muss es auch in der richtigen Reihenfolge tun. Also er muss zuerst zur Rechnungsstelle gehen, dann zur Lagerhaltung, danach zum Lieferdienst, dann wieder zurück zur Lagerhaltung, nochmal zur Rechnungsstelle und am Ende zum E-Mail-System. Wir sehen also der Client sieht sich einer ziemlich komplexen Schnittstelle gegenüber und er muss ziemlich viel Wissen besitzen darüber, wie mit den einzelnen Systemen kommuniziert werden soll. Das ist aber nur die eine Hälfte des Problems. Die andere sind Änderungen an einem der Teilsysteme. Wenn zum Beispiel der Lieferdienst ausgetauscht wird. Das heißt, das Shopsystem arbeitet ab sofort mit einem anderen Lieferdienst und der hat natürlich ein anderes System, was anders angesprochen werden möchte, dann muss der Client davon wissen. Das heißt, auch der Client muss entsprechend geändert werden. Oder wenn die Rechnungsstelle ein neues Abrechnungssystem bekommt, dann wird auch das für den Client von Interesse sein oder von Wichtigkeit sein und der Client muss ebenfalls entsprechend angepasst werden. Zusammenfassend können wir also sagen, dass die Entwicklung von solchen Clients recht komplex und recht aufwendig ist. Dass sie viel Wissen erfordert um den Aufbau und die internen Abläufe des Systems und dass Änderungen an auch nur Teilen des Systems in der Regel bereits zu Änderungen an den Client führen. Die Lösung sieht nun folgendermaßen aus. Wir erweitern unser System um ein zusätzliches Objekt und stellen das vor alle anderen Teilsysteme. Das ist dann die sogenannte Fassade, die auch dem Entwurfsmuster seinen Namen gibt. Diese Fassade vereint nun all das nötige Detailwissen um die einzelnen Teilsysteme, in welcher Reihenfolge, welche Funktionen aufzurufen sind und stellt dem Client diese Funktionalität in einer sehr vereinfachten Schnittstelle zur Verfügung. In diesem Fall könnte das ein einzelner Methodenaufruf sein, der dann einfach bestellen heißen könnte. Der Client benötigt nun überhaupt gar kein Wissen mehr darüber, wie der Bestellvorgang im Einzelnen abläuft, denn darum kümmert sich die Fassade. Problem 1, also komplexe Schnittstelle, aufwendig zu erstellender Client, haben wir damit gelöst. Wie ist es mit der Wartbarkeit des Systems, also dem Aufwand bei Veränderungen? Nehmen wir das Beispiel von vorhin. Der Lieferdienst wird ausgewechselt. Dann müssen wir natürlich in der Fassade eine gewisse Anpassung vornehmen. Der Client bleibt davon aber völlig unbeeindruckt. Denn die Fassade verbirgt diese Änderung vor ihm und auch dass die Rechnungsstelle ein neues Abrechnungssystem bekommt, interessiert den Client eigentlich nicht wirklich. Insbesondere wenn wir uns nochmal vor Augen halten, dass Client prinzipiell viele verschiedene Arten von Clients bedeuten kann, ist das doch ein ziemlicher Fortschritt. Fassen wir zusammen. Die Fassade sorgt dafür, dass der Client und die Teilsysteme nur noch lose gekoppelt sind. Das bedeutet, dass insbesondere der Client nicht mehr abhängig ist von irgendeinem dieser Teilsysteme. Er benötigt also auch kein Wissen mehr über die Teilsysteme, darüber wie sie angesprochen sind oder auch nur, wo sie sich befinden oder wie sie funktionieren und auch der zweite Teil unsere Problems wird gelöst, Änderungen an einem der Teilsysteme haben keinerlei Auswirkungen mehr auf den Client oder die Clients. Als Nachteil lässt sich anführen, dass wir natürlich wieder eine zusätzliche Indirektion haben. Also der Client ruft jetzt nicht mehr die Systeme direkt auf, sondern er ruft die Fassade auf und die Fassade wiederum kommuniziert dann mit den Systemen, was zu leicht verlängerten Laufzeiten führen kann. Es gibt natürlich einen gewissen Mehraufwand für die Entwicklung der Fassade selbst. Dafür müssen wir aber dann natürlich wieder entsprechend weniger Aufwand in die Entwicklung der Clients stecken. Ein sehr wichtiger Punkt, den man berücksichtigen sollte, ist, dass die Gefahr besteht, dass die Fassade zum Gott-Objekt wird, also ein Weiß-alles-kann-alles-Objekt. Wenn man nicht aufpasst, kann es nämlich passieren, dass die Fassade nicht nur mit den anderen Teilsystemen kommuniziert, sondern immer mehr Funktionalität selbst beinhaltet. Sie wird damit immer größer, immer komplexer und die Vorteile, die wir vorhin gesehen haben, verkehren sich in Nachteile. Wir dürfen also nie vergessen, die Fassade ist nur der Koordinator und delegiert lediglich die Aufrufe an die einzelnen Teilsysteme. Wenn die Fassade im Laufe der Zeit zu komplex wird, dann sollte man überlegen, ob man eventuell Unterfassaden einführt. Unsere Fassade könnte also zum Beispiel für die Abwicklung des Bezahlvorgangs mit verschiedenen Teilsystemen kommunizieren müssen, je nachdem ob mit Kreditkarte bezahlt wurde oder per Überweisung oder ob eine Rechnung geschrieben wird. In diesem Fall könnte man dann also eine Unterfassade einführen, die den Zugriff auf diese verschiedenen Bezahlsysteme vereinfacht und unsere Hauptfassade greift dann auf diese Bezahlunterfassade zu. Sie sollten auf jeden Fall vermeiden, dass Fassaden zu umfangreich werden. Eine einzige Fassade, die die komplette Funktionalität einer gesamten Anwendung beinhaltet und dem Client dann in Form von mehreren hundert Methoden zur Verfügung stellt, nutzt dem Client auch wieder wenig. Da Clients in der Regel eine Reihe typischen Abläufen durchführen möchten, also Anwendungsfälle, Use Cases, besteht eine gute Strategie darin, eine Fassade pro Use Case zu bauen. Je nachdem, was der Client dann jeweils tun möchte, kann er sich dann an die entsprechende Fassade wenden. Nun kennen Sie also das Entwurfsmuster Fassade und Sie wissen auch, worauf Sie achten müssen, wenn Sie es einsetzen.

Grundlagen der Programmierung: Entwurfsmuster

Erhalten Sie einen fundierten Einstieg in das Thema Entwurfsmuster (Design Patterns) und erfahren Sie, wie Sie Entwurfsmuster in objektorientierten Programmiersprechen umsetzen.

2 Std. 49 min (33 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!