ABAP OO - Grundlagen
In diesem Artikel schauen wir uns einmal die Grundlagen der Entwicklung im objektorientierten Bereich an und starten damit eine kleine Serie von Artikeln.
Inhaltsverzeichnis
Wenn du mal wieder nach einer neuen Stelle Ausschau halten solltest, dann wird dir auffallen das dort fast immer steht: Entwickler mit ABAP & ABAP OO. Eigentlich sollte das ein grundsätzliches Verständnis für jeden Entwickler sein, dass dieser auch die neuesten Technologien und Sprachelemente beherrscht. Leider sieht es bei vielen Entwicklern anders aus. Man hat zwar etwas von ABAP OO gehört, doch verwenden würde man es nur wenig oder nur in einem einfachen Stil. Dabei werden solide und starke OO Kenntnisse für viele saubere Architekturen auch innerhalb von SAP benötigt. An dieser Stelle wollen wir mit unserem kleinen Grundkurs aufsetzen.
Verwendung
Im Gegensatz zur funktionalen Programmierung setzt die objektorientierte Welt vor allem auf die Verwendung von gekapselten Objekten, um so ein geschlossenes Modell zu erschaffen. Dieses Modell besitzt Attribute und Methoden, die ein Verwender im Endeffekt nutzen kann, um so mit dem Objekt zu interagieren. Dabei dient die Klasse erst einmal als eine Art Bauplan, der immer wieder verwendet werden kann. Durch die Separierung der Funktionen und Attribute kann die Klasse immer wieder verwendet werden, dieses Verhalten findest du Heute bereits in Funktionsgruppen und bei Funktionsbausteinen, wobei man einige Abstriche machen muss, da die Daten zur Laufzeit nicht automatisch gelöscht werden in der Funktionsgruppe (globale Daten).
Damit können Klassen und Methoden im ganzen System wiederverwendet werden, was den Reuse solcher Objekte noch einmal erhöht und zu den Stärken von Klassen gehört.
Beispiele
In diesem Abschnitt wollen wir dir einmal ein paar Beispiele näher bringen, wie solche wiederverwendbaren Klassen aussehen können und wo sie überall genutzt werden können.
- Logging - Für das Logging von Nachrichten gibt es in SAP ein ganz zentrales Framework, das BALLOG. Um mit dem Framework zu interagieren gibt es verschiedene Bausteine und Konfigurationen, die die Nachrichten übernehmen, anzeigen oder auf der Datenbank speichern können. Die Funktionen, das Speichern der Meldungen, die Anzeige und die Sicherung auf der Datenbank können leicht wiederverwendbar in eine Klasse implementiert werden, damit du nicht jedes Mal alle Funktionsbausteine neu übernehmen musst oder vielleicht sogar Logiken von einem Programm zum Nächsten kopierst.
- Datenmapping - Du führst ein Mapping von BAPI zu Datenbank Daten durch und das in beide Richtungen? Wahrscheinlich wirst du dieses Mapping auch in einem nächsten Programm gebrauchen können. Deshalb solltest du es in einer globalen Klasse implementieren, um die Funktionen jederzeit wiederverwenden zu können.
- Verarbeitung - Du führst verschiedene Verarbeitungsschritte in einer Kette aus und jeder Schritt ist recht komplex? Hier solltest du nicht alles in einen Report packen oder eine Monsterklasse aufbauen, sondern Funktionen wie Datenvalidierung, Mapping und Buchung in verschiedene wiederverwendbare Objekte implementieren.
Du merkst, bei vielen Beispielen geht es um die Wiederverwendung von Code an anderen Stellen. Der schlechteste Ansatz wäre das Kopieren von solchem Code, da du ebenfalls Fehler mitkopieren würdest, die du später an zwei oder drei Stellen korrigieren darfst.
Hinweis: Bei jeder Entwicklung sollte deshalb DRY (Don't repeat yourself) an erster Stelle stehen, wenn du merkst du wiederholst dich, halte inne und beginne mit dem Refactoring.
Besonderheit
Im Gegensatz zu Java oder anderen objektorierntierten Sprachen gibt es auch im ABAP Umfeld einige Besonderheiten, die man beachten sollte.
- Konstruktor - ABAP Klassen besitzen zwei Konstruktoren, den CONSTRUCTOR der bei jeder Instanziierung aufgerufen wird und den CLASS_CONSTRUCTOR der bei der ersten Verwendung der Klasse durchlaufen wird, egal ob du Konstanten, statische Methoden oder eine Instanz verwendest.
- Destruktor - Es gibt keinen richtigen Destruktor, den man auch ausprägen kann. Bevor du ein Objekt löschen möchtest, musste du also selbst eine Methode implementieren (z.B. FREE oder CLEAN) und aufrufen.
- Einfachvererbung - Jede Klasse kann maximal eine Oberklasse haben von der geerbt (Attribute, Methoden) wird.
- Interfaces - Können miteinander zu größeren Interfaces verschachtelt werden und öffentliche Attribute besitzen, die dann entsprechend in die implementierenden Klassen vererbt werden.
Begriffe
Im objektorientierten Umfeld wirst du immer wieder auf die gleichen Begriffe stoßen, deshalb wollen wir dir an dieser Stelle noch einmal die wichtigsten Begriffe näher bringen und den Hintergrund erklären.
Klasse
Ist der eigentliche Bauplan für ein Objekt und enthält die Attribute und Methoden, die der Verwender am Ende nutzen kann. Die einfachste Implementierung einer solchen Definition kann wie folgt aussehen:
CLASS lcl_example DEFINITION.
ENDCLASS.
Objekt/Instanz
Die beiden Begriff werden gleich verwendet und beschreiben eine "Variable" die ein verwendebare Klasse instanziiert. Die Instanziierung geschieht durch CREATE OBJECT oder besser durch NEW:
DATA(go_instance) = NEW lcl_example( ).
Instanziierung
Wie du oben gesehen hast, entsteht ein Objekt durch Instanziierung der Klasse (des Bauplans) und Erzeugung einer Referenz auf einer Variablen. Aus einer Klasse ist ein Objekt oder auch eine Instanz geworden.
Eigenschaft/Attribut
Ein Attribut ist eine Variable oder eine Konstante in einer Klasse, die du benutzen kannst und in der du Daten halten kannst. Ein Attribut verhält sich in einer Klasse wie eine globale Variable und steht jeder Methode zur Verfügung.
CLASS lcl_example DEFINITION.
PUBLIC SECTION.
DATA:
gd_flag TYPE abap_bool.
ENDCLASS.
Methode
Die Methode ist wie FORM oder ein Funktionsbaustein in einer Klasse, sie führt verschiedene Aktionen innerhalb der Klasse aus, ändert Variablen oder gibt einfach ein Ergebnis zurück.
CLASS lcl_example DEFINITION.
PUBLIC SECTION.
METHOD:
calculate_correct_value
IMPORTING
id_value TYPE string
RETURNING VALUE(rd_result) TYPE i.
ENDCLASS.
Fazit
Bevor wir mit den eigentlichen Beispielen und dem Coding starten, wollten wir dir erst einmal eine kurze Einführung geben zum Theme Objektorientierung im Bereich ABAP. Mit dem nächsten Artikel werden wir etwas tiefer in die Grundlagen des Programmierens mit Objekten einsteigen.