Wissen aus erster Hand. Leseprobe Um einheitliche Objekte für eine ABAP-Anwendung zu erzeugen, können Sie standardisierte Entwurfsmuster einsetzen. In dieser Lese- probe stellen Ihnen die Autoren die unterschiedlichen Möglichkeiten vor, die sich durch Entwurfsmuster für die Erzeugung von Objekten ergeben. Darüber hinaus umfasst diese Leseprobe neben Kapitel 3 des Buches das Inhaltsverzeichnis sowie den Index. Kapitel 3: »Erzeugungsmuster« Inhaltsverzeichnis Index Die Autoren Leseprobe weiterempfehlen Nurgül Atilgan, Markus Straub Entwurfsmuster in ABAP 384 Seiten, gebunden, 2. Auflage 2015 69,90 Euro, ISBN 978-3-8362-3810-6 www.sap-press.de/3881 3810.book Seite 63 Montag, 7. September 2015 12:29 12 Kapitel 3 Um einheitliche Objekte für eine Anwendung zu erzeugen, können Sie standardisierte Entwurfsmuster einsetzen. Dazu steht Ihnen die Gruppe der Erzeugungsmuster zur Verfü- gung, deren Entwurfsmuster unterschiedliche klassenbasierte oder objektbasierte Objekte erzeugen. 3 Erzeugungsmuster Alle Entwurfsmuster, die in die Kategorie der Erzeugungsmuster ein- geordnet sind, dienen dazu, Objekte zu erstellen. Die für die Objekt- erzeugung notwendigen Details werden bei den Entwurfsmustern dieser Kategorie in Klassen gekapselt. Der Vorteil dieses Verfahrens ist, dass die Implementierung der Objekterzeugung komplett getrennt von den zu erstellenden Objekten erfolgt. Das heißt, es müssen keine Änderungen am Objekt selbst vorgenommen werden, wenn ein neues Objekt erstellt wird. Wie bereits in Abschnitt 1.1.2, »Softwaredesign mithilfe von Ent- Klassen- und wurfsmustern«, erläutert, unterscheiden wir bei Entwurfsmustern Objektmuster grundsätzlich zwischen zwei Varianten: (cid:2) Einerseits gibt es objektbasierte Entwurfsmuster, die durch objekt- basierte Programmierung umgesetzt werden. Durch die Verwen- dung von ABAP-Objects-Schlüsselwörtern (z.B. CREATE OBJECT oder ab SAP NetWeaver 7.4 das Schlüsselwort NEW) werden dabei Instanzen der Klassen erzeugt. (cid:2) Die zweite Variante sind Entwurfsmuster, die auf Klassenmustern basieren. Diese werden mithilfe statischer Methoden umgesetzt. Im Folgenden ordnen wir die in diesem Kapitel vorgestellten Muster Klassen- und der Gruppe der Erzeugungsmuster diesen beiden Kategorien zu: objektbasierte Erzeugungsmuster (cid:2) Klassenmuster – Factory Pattern Wie alle Erzeugungsmuster erzeugt das Factory Pattern neue Objekte. Diese Objekte werden über Klassen anhand von 63 3810.book Seite 64 Montag, 7. September 2015 12:29 12 3810.book Seite 65 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Erzeugungsmuster 3 Importparametern definiert. Bei diesen Klassen handelt es sich Änderungen an dem Objekt für alle Aufrufer gültig. Dieses Pat- jeweils um Ableitungen einer abstrakten Klasse. Das Entwurfs- tern wird daher für den globalen Zugriff auf Instanzen verwen- muster setzt dabei das Polymorphismus-Prinzip um. det. – Abstract Factory Pattern In den folgenden Abschnitten erläutern wir die einzelnen Erzeu- Aufbau dieses Das Abstract Factory Pattern basiert auf dem Factory Pattern. Im gungsmuster näher. Um Ihnen einen einfachen Überblick über die Kapitels Falle des Abstract Factory Patterns ist die Factory-Klasse selbst Entwurfsmuster zu geben und die Vergleichbarkeit zu gewährleis- eine abstrakte Klasse. Dies hat den Vorteil, dass die Factory- ten, sind die Abschnitte dabei jeweils nach der folgenden Struktur Klasse noch flexibler und austauschbarer ist. Das Abstract Fac- gegliedert: tory Pattern erzeugt keine konkreten Objekte, sondern kon- 1.Problem krete Factory-Klassen. Dies bedeutet, eine abstrakte Factory- Zu jedem Entwurfsmuster beschreiben wir zunächst die Situation, Klasse ist eine Factory für die konkreten Factory-Klassen. Durch in der es angewendet werden kann. dieses Konzept lassen sich jederzeit neue Factory-Klassen inte- grieren oder bestehende durch andere Factory-Klassen ersetzen. 2.Ansatz und Lösung (cid:2) Objektmuster Im zweiten Schritt beschreiben wir den Lösungsansatz des jewei- ligen Entwurfsmusters. Wir gehen anhand eines abstrakten Bei- – Builder Pattern spiels darauf ein, wie das Entwurfsmuster und dessen Komponen- Beim Builder Pattern wird die Erzeugung komplexer Objekte ten aufgebaut sind und wie diese in Beziehung zu anderen Klassen von der eigentlichen Repräsentation getrennt. Dadurch können stehen. Ziel dieser Beschreibungen ist es, die Muster in der Praxis unterschiedliche Repräsentationen der Objekte erzeugt wer- anwenden zu können. den. Diese sind immer abhängig von den Anforderungen der 3.Einsatzbeispiele jeweiligen Klassen bzw. von der Erzeugung. Dieses Entwurfs- Im nächsten Schritt führen wir mögliche Einsatzgebiete für die muster arbeitet mit unterschiedlichen Konstruktoren, die oft in einzelnen Entwurfsmuster an. Verbindung mit Kompositum-Entwurfsmustern verwendet werden. Das Kompositum-Entwurfsmuster wird genutzt, um 4.Umsetzung in ABAP Hierarchien aus Objekten aufzubauen, die zusammen als Teile In den Abschnitten »Umsetzung in ABAP« zeigen wir Ihnen, wie eines Ganzen dienen. Dabei werden die Objekte zu Baumstruk- die Entwurfsmuster in ABAP realisiert werden können. Wir erläu- turen zusammengesetzt. tern dabei jeweils, wie das Entwurfsmuster aufgebaut wird und welche Funktionen die einzelnen Methoden haben. Die Imple- – Prototype Pattern mentierung der einzelnen Entwurfsmuster erfolgt jeweils in Das Prototype Pattern wird zunächst mit einer vorläufigen In- ABAP-Klassen, die wiederum verschiedene Unterklassen besitzen. stanz eines komplexen Objekts initialisiert. Im weiteren Verlauf Aus Gründen der Übersichtlichkeit erstellen wir in unseren Bei- wird immer das ursprüngliche Objekt des Prototyps geklont spielen alle Klassen über die Transaktion SE24, den Class Builder. und kann unabhängig vom eigentlichen Objekt verwendet wer- den. 5.Evaluation Abschließend stellen wir jeweils die Vor- und Nachteile des – Singleton Pattern besprochenen Entwurfsansatzes einander gegenüber. Dadurch Das Singleton Pattern wird mithilfe einer Klasse realisiert. Von möchten wir Ihnen die Entscheidung erleichtern, welches Ent- dieser Klasse kann nur ein Objekt instanziiert werden. Greifen wurfsmuster Sie am besten in Ihren Anwendungen und für Ihren Sie anschließend auf das Entwurfsmuster zu, erhalten Sie konkreten Zweck verwenden können. Viele Entwurfsmuster wei- immer das ursprünglich instanziierte Objekt. Da stets mit Refe- sen problematische Seiteneffekte auf, die aber durch eine Kombi- renzen auf diese einmalige Instanz gearbeitet wird, sind alle nation mehrerer Entwurfsmuster minimiert werden können. 64 65 3810.book Seite 66 Montag, 7. September 2015 12:29 12 3810.book Seite 67 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 3.1 Builder Pattern Client Das Builder Pattern wird im Deutschen auch als Erbauermuster bezeichnet und gehört zu den GoF-Mustern, also jenen Entwurfs- mustern, die ursprünglich von der Gang of Four beschrieben wurden (siehe auch Abschnitt 1.1, »Was sind Entwurfsmuster?«). Das Builder Pattern trennt den Erzeugungsprozess eines komplexen Objekts von der eigentlichen Verwendung dieses Objekts mithilfe von Klassen- methoden. Dadurch ist es möglich, den Erzeugungsprozess, der in Direktor Erbauer diesem Zusammenhang auch oft Konstruktionsprozess genannt wird, unabhängig von der Repräsentation anzuwenden. + konstruiere() + baue_teile() 3.1.1 Problem Beispiel: Das Builder Pattern wird verwendet, um den Erzeugungsprozess verschiedene komplexer Objekte von der Repräsentation dieser Objekte zu ent- Exportwege koppeln. Wir verdeutlichen dies anhand eines Beispiels. Sie können Produkt konkreter Erbauer dieses Entwurfsmuster z.B. für eine Anwendung verwenden, die Daten aus einer Datenbanktabelle liest, diese Daten überarbeitet und + baue_teile() + erhalte_ergebnis() dann wieder in die Datenbank zurückschreibt. Möchten Sie dieser Anwendung eine Exportschnittstelle hinzufügen, die Exportmöglich- Abbildung 3.1 Builder Pattern – Aufbau im UML-Klassendiagramm keiten in andere Anwendungen anbietet, können Sie unterschiedli- che Builder definieren, die vom Anwender über die Anwendungs- Klasse und ihre Rolle Beschreibung oberfläche ausgewählt werden können, und sie jeweils in anderen Erbauer Die Erbauerklasse ist eine abstrakte Klassen- Datenformaten speichern. Ein solcher Builder erzeugt die Objekte, schnittstelle, die für die Erzeugung der komple- die dann die Daten als CSV-Datei exportieren, ein weiterer Builder xen Objekte und auch für die Erzeugung der Bau- die Objekte, die Daten als XML-Dateien exportieren, und ein letzter teile zuständig ist. Builder könnte die Daten über SAP Smart Forms als PDF aufbereiten konkreter Erbauer Die Klasse des konkreten Erbauers kümmert sich und exportieren. Auf diese Weise wird die eigentliche Verarbeitung darum, dass die einzelnen Bauteile während der der Daten vom Exportprozess getrennt. Implementierung des Produkts erzeugt werden. Die Erbauerklasse bzw. -schnittstelle gibt dem konkreten Erbauer den Rahmen sowie die Defini- 3.1.2 Ansatz und Lösung tion vor, wie die Klasse des konkreten Erbauers Mithilfe eines UML-Diagramms zeigen wir Ihnen zunächst, wie das durch die Repräsentationsschicht implementiert werden kann. Über die Erbauerschnittstelle kann Builder Pattern aufgebaut ist. In Abbildung 3.1 sehen Sie fünf ABAP- das Objekt an das Produkt weitergegeben wer- Klassen, die zusammen das Builder Pattern bilden. den. Bedeutung der Diese Klassen nehmen jeweils eine bestimmte Rolle im Entwurfs- Tabelle 3.1 Builder Entwurfsmuster – beteiligte Klassen einzelnen Klassen muster ein, die wir in Tabelle 3.1 genauer erläutern. 66 67 3810.book Seite 68 Montag, 7. September 2015 12:29 12 3810.book Seite 69 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 Klasse und ihre Rolle Beschreibung Direktor Der Direktor erzeugt die komplexen Objekte konkreter Client Direktor mithilfe der Erbauerschnittstelle. Hier können Erbauer unterschiedliche Varianten hinterlegt werden, die definieren, welche Arten von Produkten erzeugt werden können und wie diese zusam- neuer konkreter_erbauer() mengebaut werden müssen. Beispiele sind ein Auslagerungsauftrag für das Lager, ein Verschrot- neuer direktor(erbauer:ein_erbauer) tungsauftrag oder ein Auftrag für die Ausbu- chung von Material als Varianten des Objekts konstruiere() Auftrag. Produkt Als Produkt wird das zu konstruierende kom- erzeuge_bauteil_a() plexe Objekt bezeichnet. Dieses Produkt basiert auf Klassen, die zur Beschreibung der einzelnen erzeuge_bauteil_b() Bauteile und Produkte erforderlich sind. Ein kon- kretes Beispiel wäre ein Auftrag z.B. für die Ver- erzeuge_bauteil_c() sendung o.Ä. Client Der Client ist der Endanwender oder eine System- erhalte_ergebnis(erbautes:erbautes) aktion, die z.B. über die Oberfläche einer Web- Dynpro-Anwendung eine Aktion auslöst, z.B. durch den Klick auf einen Button. Der Client definiert so die Rahmenbedingungen für die Pro- Abbildung 3.2 Builder Pattern – UML-Sequenzdiagramm dukterzeugung und gibt diese an den Direktor weiter. 3.1.3 Einsatzbeispiel Tabelle 3.1 Builder Entwurfsmuster – beteiligte Klassen (Forts.) Um Ihnen die Einsatzgebiete des Builder Patterns zu verdeutlichen, Export aus erläutern wir seine Verwendung exemplarisch anhand eines Daten- Web-Dynpro- Sequenzdiagramm Das Sequenzdiagramm des Builder Patterns in Abbildung 3.2 können Anwendung exports aus einer Anwendung in Web Dynpro ABAP. Dabei hat der Sie wie folgt lesen: Der Client erzeugt zu Beginn ein Objekt vom Typ Anwender verschiedene Möglichkeiten, einen Auftrag, den er aufge- der Klasse für den konkreten Erbauer. Anschließend erzeugt der rufen hat, zu exportieren. Der Auftrag kann nicht direkt als PDF Client ein Objekt vom Typ Direktor. Nun ist die Grundlage für das exportiert werden, sondern muss vor dem Export bearbeitet wer- Builder Pattern geschaffen, und der Client kann eine der zentralen den, um sicherzustellen, dass z.B. die Druckausgabe fehlerfrei funk- Methoden aus dem Direktor-Objekt aufrufen. Dabei werden die tioniert und alle Zeichen auf dem Formular korrekt und lückenlos Methoden der Erbauerschnittstelle aufgerufen, die wiederum unter- dargestellt werden. schiedliche Bauteile für das Produkt über den konkreten Erbauer erzeugen lassen. Dies kann ein Bauteil sein, es können aber auch Abbildung 3.3 veranschaulicht dieses Einsatzbeispiel anhand eines Klassendiagramm mehrere Bauteile in Kombination sein. Als Ergebnis erhält der Client UML-Diagramms. Die Klasse, die den Direktor repräsentiert, wird in das konstruierte standardisierte Objekt vom konkreten Erbauer diesem Fall von der Web-Dynpro-Oberfläche über eine Aktion auf- zurück. gerufen und stößt dadurch die Erzeugung des PDF-Exports (Objekt der konkreten Erbauerklasse) an. Auf dieser Web-Dynpro-Oberflä- che gibt es in unserem Beispiel einen Button, der die Methode BUTTON_AUFTRAG_EXPORT_TO_PDF() auslöst. Klickt der Anwender auf diesen Button, werden ihm unterschiedliche Exportmöglichkeiten 68 69 3810.book Seite 70 Montag, 7. September 2015 12:29 12 3810.book Seite 71 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 zur Auswahl gestellt. Die konkrete Klasse ERBAUER_EXPORT_1 enthält durchführt, den Kunden darüber benachrichtigt, dass sein Auftrag in alle Methoden, die zur Verfügung stehen, um das Auftragsdokument Bearbeitung ist, und zusätzlich noch einen weiteren Workflow startet. Dies kann sehr einfach über den Methodenpool der Subklassen realisiert zu überarbeiten und mit weiteren Informationen anzureichern. In werden. In dem Subsystem werden dabei z.B. zentrale Klassen des SAP- der Methode UEBERPRUEFE_EINGABEN() wird z.B. geprüft, ob diese Systems oder Eigenentwicklungen aufgerufen, die die gewünschten Akti- Daten korrekt sind. An dieser Stelle kann geprüft werden, ob der onen im System durchführen. Kunde, für den der Auftrag angelegt wurde, bereits im System vor- handen ist, ob für ihn eine Bonitätsprüfung vorliegt und vieles mehr. 3.1.4 Umsetzung in ABAP erbau«Beur_iledxepr»ort_1 In diesem Abschnitt zeigen wir Ihnen, wie Sie das Builder Pattern in Report Direktor Überprüfe Eingaben auftrag:dokument ABAP umsetzen können. Wir greifen dazu auf das Beispiel aus Abbil- + erzeuge_pdf_dokument() + button_auftrag_export_to_pdf() :void + erzeuge_sap_report() + ist_backend_system_korrekt() dung 3.2 zurück. Zur Implementierung des Builder Patterns erstellen + erzeuger_auftrag_verkauf(dokument) + erzeuge_ausdruck_bei_drucker() + ist_wiw_korrekt() + ueberpruefe_eingaben() + ist_adresse_korrekt() wir einen ABAP-Report in Transaktion SE38. In diesem Report wird + ueberarbeite_texteingaben() + pruefe_bestellpostionen() + interpretiere_eingaben() + pruefe_pflichtfelder() das Pattern umgesetzt und kann hier später auch ausgeführt werden. Aufruf 1: Wird der Report später in eine Anwendung integriert, findet dies button_erzeuge_auftrag(){ erzeuger_1.ueberpruefe_eingaben(); «Produkt» meistens in einer Verarbeitungsklasse statt, die wiederum ihre eige- erzeuger_1.ueberarbeite_texteingaben(); Texteingaben erzeuger_1.interpretiere_eingaben(); nen Klassen besitzt. Wir verzichten in diesem Kapitel darauf, alle erzeuger_1.erzeuge_pdf_dokument(); + pruefe_auf_ungueltige_zeichen() } + pruefe_auf_pflichteingaben() diese Klassen in Transaktion SE24 anzulegen, um das Beispiel für Sie + pruefe_auf_plausibilitaet() Aufruf 2: + gleiche_eingaben_mit_merkmalswerte_ab() übersichtlicher zu gestalten. button_erzeuge_auftrag(){ erzeuger_1.ueberpruefe_eingaben(); erzeuger_1.ueberarbeite_texteingaben(); Interpretiere Durch das Erzeugen des ABAP-Reports öffnet sich der ABAP Editor erzeuger_1.interpretiere_eingaben(); erzeuger_1.erzeuge_sap_report(); + pruefe_bonitaet() mit der folgenden Codezeile: erzeuger_1.erzeuge_ausdruck_bei_drucker(); + pruefe_fruehestmoeglicher_liefertermin() } + pruefe_lagerbestand() REPORT zdp_ar_erz_builder. Abbildung 3.3 Builder Pattern – UML-Klassendiagramm für Beispielanwendung Listing 3.1 zeigt die Definition der Klasse, in der das Produkt defi- Produktklasse niert wird. Diese Produktklasse beinhaltet zwei Methoden und ein Unterklassen Die Methoden, die von der Erbauerklasse angesprochen werden, internes Attribut. Das interne Attribut hat den Datentyp STRING und beinhalten einen standardisierten Aufruf der Unterklassenmethoden enthält den Namen des Bauteils. Es können noch weitere Informati- INTERPRETIERE(), TEXTEINGABEN() und UEBERPRUEFE_EINGABEN(). onen und Objekte in dieser Klasse abgelegt werden. Die Methoden Die Unterklassen sind so realisiert worden, dass jede dieser Klassen fügen die neuen Bauteile in das Attribut I_BAUTEILE der Klasse ZDP_ andere Methoden aufrufen kann. Sie sind als ein Pool von Funktio- CL_BUILD_PRODUKT hinzu. Über die Methode ANZEIGEN() können die nen zu verstehen, die Sie verwenden können. Dazu werden jeweils Bauteile ausgegeben werden, die im Produkt erzeugt wurden. Die nur die Informationen benötigt, die die Methoden selbst anfordern. Methode HINZUFUEGEN() fügt der Bauteilliste neue Bauteile hinzu. Die Erzeugungsmethoden der Builder-Klasse rufen mit den Unter- klassen mehrere dieser Funktionen auf, um die Texte und Eingaben CLASS zdp_cl_build_produkt DEFINITION im Auftragsformular zu überprüfen. Sie können an dieser Stelle alle PUBLIC FINAL CREATE PUBLIC. komplexen Methoden programmieren, die für Ihren Einsatzzweck notwendig sind. PUBLIC SECTION. DATA bauteile TYPE TABLE OF string. Aufruf mehrerer Funktionen METHODS hinzufuegen IMPORTING Mithilfe des Builder Patterns können Sie z.B. einen Methodenaufruf !i_bauteile TYPE string. implementieren, der die erforderlichen Buchungen im Buchungssystem 70 71 3810.book Seite 72 Montag, 7. September 2015 12:29 12 3810.book Seite 73 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 METHODS anzeigen. PROTECTED SECTION. PROTECTED SECTION. PRIVATE SECTION. PRIVATE SECTION. ENDCLASS. ENDCLASS. Listing 3.3 Definition der Erbauerklasse innerhalb des Builder Patterns Listing 3.1 Builder Pattern – Definition der Produktklasse Als erster konkreter Erbauer wird in Listing 3.4 die Klasse des kon- Erster konkreter Nach der Definition der Klasse muss diese noch implementiert wer- kreten Erbauers ZDP_CL_BUILD_KONERB1 erstellt. Durch die abstrakte Erbauer den. Die Implementierung sehen Sie in Listing 3.2. Klasse ZDP_CL_BUILD_ERBAUER wurde definiert, welche Methoden in den einzelnen konkreten Erbauern implementiert werden müssen. CLASS zdp_cl_build_produkt IMPLEMENTATION. METHOD hinzufuegen. CLASS zdp_cl_build_konerb1 DEFINITION APPEND i_bauteile TO bauteile. PUBLIC ENDMETHOD. INHERITING FROM zdp_cl_build_erbauer METHOD anzeigen. FINAL DATA: ls_ausgabezeile TYPE string. CREATE PUBLIC. WRITE:/ 'Produkt -- Welche Bauteile sind vorhanden? --'. LOOP AT bauteile INTO ls_ausgabezeile. PUBLIC SECTION. WRITE:/ 'Objekt: ' && ls_ausgabezeile. METHODS constructor. ENDLOOP. METHODS erzeuge_bauteil_a ENDMETHOD. REDEFINITION. ENDCLASS. METHODS erzeuge_bauteil_b REDEFINITION. Listing 3.2 Builder Pattern – Implementierung der Produktklasse METHODS erhalte_ergebnis REDEFINITION. Erbauerklasse Im nächsten Abschnitt, den Sie in Listing 3.3 sehen, definieren wir PROTECTED SECTION. die Klasse ZDP_CL_BUILD_ERBAUER. Die abstrakte Klasse ZDP_CL_ PRIVATE SECTION. BUILD_ERBAUER definiert eine Hülle für die eigentlichen Erbauerklas- DATA produkt TYPE REF TO zdp_cl_build_produkt. sen ZDP_CL_BUILD_KONERB1 und ZDP_CL_BUILD_KONERB2. In der CLASS zdp_cl_build_konerb1 IMPLEMENTATION. Erbauerklasse wird definiert, welche Methoden von den konkreten METHOD constructor. Erbauerklassen implementiert werden müssen. In unserem Beispiel CALL METHOD super->constructor. sind dies die Methoden ERZEUGE_BAUTEIL_A() und ERZEUGE_BAU- CREATE OBJECT me->produkt. TEIL_B(). Anschließend wird das Objekt PRODUKT über den Rückga- ENDMETHOD. beparameter R_PRODUKT der Methode ERHALTE_ERGEBNIS() an den METHOD erzeuge_bauteil_a. Aufrufer/Direktor bzw. Client zurückgegeben. produkt->hinzufuegen('Bauteil-A'). ENDMETHOD. CLASS zdp_cl_build_erbauer DEFINITION METHOD erzeuge_bauteil_b. PUBLIC ABSTRACT produkt->hinzufuegen('Bauteil-B'). CREATE PUBLIC. ENDMETHOD. PUBLIC SECTION. METHOD erhalte_ergebnis. produkt = me->produkt. METHODS erzeuge_bauteil_a. r_produkt = me->produkt. METHODS erzeuge_bauteil_b. ENDMETHOD. METHODS erhalte_ergebnis ENDCLASS. RETURNING VALUE(r_produkt) TYPE REF TO zdp_cl_build_produkt. Listing 3.4 Builder Pattern – Definition des konkreten Erbauers 72 73 3810.book Seite 74 Montag, 7. September 2015 12:29 12 3810.book Seite 75 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 Zweiter konkreter In Listing 3.5 wird die Klasse des zweiten konkreten Erbauers ZDP_ Als Nächstes implementieren Sie den Direktor wie in Listing 3.6. Der Direktor Erbauer CL_BUILD_KONERB2 implementiert. Es können unterschiedliche Direktor ist dafür zuständig, die Erzeugung der unterschiedlichen Erbauer erstellt werden, die dem Produkt unterschiedliche Bauteile Bauteile des Produkts anzustoßen und diese in dem Produkt abzu- hinzufügen können. In einer Unternehmensanwendung kann das speichern. Der Direktor wird vom Client über die Methode KONSTRU- Produkt z.B. ein Auftrag sein. Der erste konkrete Erbauer erzeugt IERE() aufgerufen. Dieser Aufruf führt dazu, dass die unterschiedli- dann z.B. Produktionsaufträge, ein zweiter konkreter Erbauer z.B. chen Bauteile für das Produkt erzeugt werden. Lieferaufträge. CLASS zdp_cl_build_direktor DEFINITION CLASS zdp_cl_build_konerb2 DEFINITION PUBLIC FINAL PUBLIC CREATE PUBLIC. INHERITING FROM zdp_cl_build_erbauer PUBLIC SECTION. FINAL CREATE PUBLIC. METHODS konstruiere PUBLIC SECTION. IMPORTING METHODS constructor. !i_erbauer TYPE REF TO zdp_cl_build_erbauer. METHODS erzeuge_bauteil_a PROTECTED SECTION. REDEFINITION. PRIVATE SECTION. METHODS erzeuge_bauteil_b ENDCLASS. REDEFINITION. METHODS erhalte_ergebnis CLASS zdp_cl_build_direktor IMPLEMENTATION. REDEFINITION. METHOD konstruiere. PROTECTED SECTION. i_erbauer->erzeuge_bauteil_a( ). PRIVATE SECTION. i_erbauer->erzeuge_bauteil_b( ). DATA produkt TYPE REF TO zdp_cl_build_produkt. ENDMETHOD. ENDCLASS. ENDCLASS. Listing 3.6 Builder Pattern – Definition der Direktorklasse CLASS zdp_cl_build_konerb2 IMPLEMENTATION. METHOD constructor. Die Klasse ZDP_CL_BUILD_APPLIKATION, deren Implementierung Sie Client CALL METHOD super->constructor. in Listing 3.7 sehen, ist die Anwendungsklasse, die den Client reprä- CREATE OBJECT me->produkt. ENDMETHOD. sentiert. In dieser Klasse treffen alle Komponenten zusammen, die für das Builder Pattern benötigt werden. In der einzigen Methode METHOD erzeuge_bauteil_a. START() werden zunächst alle Objekte der unterschiedlichen Klassen produkt->hinzufuegen('Bauteil-X'). erzeugt, die benötigt werden, um den Direktor aufzurufen. Der ENDMETHOD. Direktor lenkt dann automatisch alle Aktionen, um das Produkt mit METHOD erzeuge_bauteil_b. seinen Bauteilen zu erzeugen. produkt->hinzufuegen('Bauteil-Y'). CLASS zdp_cl_build_applikation DEFINITION ENDMETHOD. PUBLIC FINAL CREATE PUBLIC. METHOD erhalte_ergebnis. PUBLIC SECTION. produkt = me->produkt. DATA lo_erbauer TYPE REF TO zdp_cl_build_erbauer. r_produkt = produkt. METHODS start. ENDMETHOD. PROTECTED SECTION. ENDCLASS. PRIVATE SECTION. Listing 3.5 Builder Pattern – Definition des zweiten konkreten Erbauers ENDCLASS. 74 75 3810.book Seite 76 Montag, 7. September 2015 12:29 12 3810.book Seite 77 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Builder Pattern 3.1 CLASS zdp_cl_build_applikation IMPLEMENTATION. durch den konkreten Erbauer 1 erzeugt. Hingegen wurden bei Pro- METHOD start. dukt 2 die Bauteile X und Y durch den konkreten Erbauer 2 erzeugt. DATA: lo_direktor TYPE REF TO zdp_cl_build_direktor. DATA: lo_b1 TYPE REF TO zdp_cl_build_konerb1. DATA: lo_b2 TYPE REF TO zdp_cl_build_konerb2. DATA: lo_p1 TYPE REF TO zdp_cl_build_produkt. DATA: lo_p2 TYPE REF TO zdp_cl_build_produkt. CREATE OBJECT lo_direktor. CREATE OBJECT lo_b1. CALL METHOD lo_direktor->konstruiere( lo_b1 ). lo_p1 = lo_b1->erhalte_ergebnis( ). Abbildung 3.4 Builder Pattern – Reportausgabe lo_p1->anzeigen( ). CREATE OBJECT lo_b2. 3.1.5 Evaluation Ein entscheidender Vorteil des Builder Patterns ist, dass bei der Vorteile CALL METHOD lo_direktor->konstruiere( lo_b2 ). lo_p2 = lo_b2->erhalte_ergebnis( ). Implementierung die Objekte der Repräsentationsschicht komplett lo_p2->anzeigen( ). von den Konstruktionsobjekten bzw. der Konstruktionsschicht iso- ENDMETHOD. liert sind. Dies wird durch die Objektkapselungen erreicht. Das ENDCLASS. bedeutet, dass die Anwendung sehr robust und weniger angreifbar Listing 3.7 Builder Pattern – Definition und Implementierung der Applikationsklasse durch Injections (Angriffe z.B. durch Hacking) sowie weniger fehler- anfällig durch die Kapselungen ist. Integration in Um das Builder Pattern in einer Anwendung verwenden zu können, Report muss jetzt nur noch die Applikationsklasse aufgerufen werden. Der Ein weiterer Vorteil ist, dass die Erbauerklasse als Repräsentant nach außen dient, d.h. für andere Klassen der Anwendung oder für den Quellcode dieser Klasse kann auch direkt in eine Anwendung inte- Client über die Benutzeroberfläche aufrufbar ist. In der Repräsentati- griert werden. In unserem Beispiel integrieren wir den Quellcode in onsschicht werden die internen Klassen, d.h. die konkreten einen ABAP-Report mit der folgenden Codezeile: Erbauer, vor dem Direktor versteckt. Die einzelnen Klassen sind REPORT zdp_ar_erz_builder. dabei voneinander isoliert, obwohl sie in einer Anwendung zusam- DATA lo_app TYPE REF TO zdp_cl_build_applikation. menarbeiten. CREATE OBJECT lo_app. lo_app->start( ). Ein weiterer wichtiger Grund, dieses Entwurfsmuster zu verwenden, Listing 3.8 Builder Pattern – Aufruf im ABAP-Report ist, dass der gesamte Konstruktionsprozess über eine zentrale Stelle, den Direktor, gesteuert wird. Dieser Konstruktionsprozess kann Report ausführen Das Ergebnis dieser Implementierung erhalten Sie durch die Ausfüh- über die verschiedenen konkreten Erbauerklassen in mehrere Pha- rung des ABAP-Reports ZDP_AR_ERZ_BUILDER über Transaktion SE38. sen untergliedert werden, was z.B. beim Factory Pattern (siehe Dabei wird die in Abbildung 3.4 dargestellte Ausgabe angezeigt. Abschnitt 3.2) nicht der Fall ist. Dazu sind seitens des Clients keine weiteren Aktivitäten notwendig. Anhand der Ausgabe in der Ausführungskonsole erkennen Sie, wie die einzelnen Objekte aufgebaut sind, die durch das Builder Pattern Auch bei einer späteren Weiterentwicklung der Anwendung hat die erzeugt wurden. Sie sehen, dass das Produkt 1 erzeugt wurde, in Verwendung des Builder Patterns Vorteile. Da die Methoden in ein- dem die Bauteile A und B enthalten sind. Diese Objekte wurden zelnen Klassen gekapselt vorliegen, können sehr einfach weitere 76 77 3810.book Seite 78 Montag, 7. September 2015 12:29 12 3810.book Seite 79 Montag, 7. September 2015 12:29 12 3 Erzeugungsmuster Factory Pattern 3.2 Klassen hinzugefügt werden, um neue Produkte zu erzeugen. Möch- (cid:2) Factory Pattern auf Basis von Methoden ten Sie eine Anwendung entwickeln, die auf neue Anforderungen Factory-Methoden sind statische Methoden, die zur Erzeugung durch neue Objekte sehr schnell und einfach reagieren kann, emp- von Objekten eines Klassentyps verwendet werden. Das Singleton fehlen wir Ihnen die Verwendung dieses Entwurfsmusters. Pattern nutzt die Factory-Methode. Dabei liest das Pattern das zu erstellende Objekt durch die statischen Methoden aus oder lässt Nachteile Um das Builder Pattern zu implementieren, sind allerdings umfas- dieses Objekt instanziieren. sende und vollständige Kenntnisse des Konstruktionsprozesses aller Objekte der Anwendung erforderlich. Nur so können die Objekte in (cid:2) Factory Pattern auf Basis von Klassen der Laufzeitumgebung richtig eingesetzt werden. Dies bedeutet, dass Eine Factory-Klasse basiert auf dem Factory-Methoden-Konzept bei komplexen Anwendungen alle Objekte vor der Umsetzung erst und erweitert dieses Konzept durch verschiedene Klassen. In Fac- einmal dokumentiert bzw. evaluiert werden müssen. Dies ist umso tory-Klassen werden nicht nur die zur Entwurfsmusterimplemen- mehr erforderlich, als die Objekte später bei der Implementierung tierung gehörenden Klassen instanziiert, sondern auch vollstän- nur noch isoliert voneinander betrachtet werden. dige und komplexe andere Objekte. So wird ein höherer Abstraktionsgrad erzielt, der es viel leichter erlaubt, eine Factory- Ein weiterer erheblicher Nachteil ist, dass die Klassen beim Builder Klasse durch andere Klassen auszutauschen, die ebenfalls dem Pattern sehr stark miteinander verzahnt sind. Diese Kopplung Konzept der Factory-Klasse entsprechen. erlaubt es nicht, die Klassen in anderen Klassen einfach wiederzuver- (cid:2) Factory Pattern auf Basis abstrakter Klassen und Interfaces wenden. Die Implementierung mit einer abstrakten Factory-Klasse ist eine sehr aufwendige Implementierungsvariante des Entwurfsmusters. Oft trägt diese Umsetzungsvariante auch den Spitznamen Toolkit. 3.2 Factory Pattern Die abstrakte Factory-Klasse hat zwei wichtige Merkmale, die gleichzeitig ihre Vorteile ausmachen: Das Factory Pattern wird im Deutschen auch als Fabrik-Entwurfs- muster bezeichnet und gehört ebenso wie das Builder Pattern zu den – Während des Erzeugungsprozesses wird nicht nur ein konkre- GoF-Entwurfsmustern. Das Factory Pattern wird eingesetzt, um die tes Element (d.h. ein Objekttyp) erzeugt, sondern es können Konstruktion von Objekten von ihren Repräsentationen zu trennen. viele und unterschiedliche Elemente erzeugt werden. Im Unterschied zum Builder Pattern kann das Factory Pattern aber – Darüber hinaus ist die abstrakte Factory-Klasse sehr flexibel nicht so einfach nach Belieben ausgebaut werden. Ein mit dem Fac- gebaut, was das Hinzufügen und Austauschen von Objekten tory Pattern verwandtes Pattern ist das Singleton Pattern, das wir in anhand zusätzlicher Factories vereinfacht. Abschnitt 3.3 erläutern. Merkmale des Ein mithilfe des Factory Patterns implementierter Konstruktionspro- 3.2.1 Problem Konstruktions- zess kann jederzeit wiederverwendet werden. Beim Factory Pattern prozesses Ein Objekt besitzt verschiedene Parameter, die bei der Erzeugung Gruppierung der zu werden privat deklarierte Konstrukte, die Methoden und Konstruk- dieses Objekts unterschiedlich angelegt werden müssen. Es können erzeugenden toren, dazu verwendet, eine direkte Instanziierung von anderen Parameter z.B. unterschiedliche Aufträge erzeugt werden, die alle anhand eines Klassen zu verhindern. Stattdessen erfolgt die Objekterzeugung mit- Parameters definiert werden. Dazu können Standardinformationen, hilfe einer statischen Methode. Das Objekt wird über diese statische wie z.B. die Auftragsnummer, das Tagesdatum etc. bereits im Rah- Methode zurückgegeben. men der Objekterzeugung festgelegt werden. Factory-Typen Es gibt die folgenden drei Möglichkeiten, ein Factory Pattern zu implementieren: 78 79
Description: