ABAP Objects

Objektorientiertes ABAP für moderne Clean Core SAP Systeme

Grundlagen

(C) Brandeis Consulting📁

OOP ist keine Erfindung der SAP - Grundlegende Konzepte

ByteByteGo Poster OO

Abstraction / Abstraktion

Nur die wesentlichen Merkmale eines Objekts werden verwendet.

Encapsulation / Kapselung

Daten und Methoden werden zusammen betrachtet und vor externem Zugriff geschützt.

Inheritence / Vererbung

Wiederverwendung von Code, wenn eine neue (Kind-)Klasse sehr viel von den Eltern übernehmen kann.

Polymorphism / Polymorphie

Eine Methode kann kann je nach Objekt unterschiedlich ausgeführt werden.

(C) Brandeis Consulting📁

Überblick - Was ist wichtig für ABAP Objects?

ABAP Objects Überblick

(C) Brandeis Consulting📁

Was ist eine Klasse?

Definition Wikipedia [1]

Unter einer Klasse (auch Objekttyp genannt) versteht man in der objektorientierten Programmierung ein abstraktes Modell bzw. einen Bauplan für eine Reihe von ähnlichen Objekten.

  • Eine Klasse stellt man sich am besten als Backform vor
  • Man kann damit sehr viele Kekse ausstechen und backen

Backform

(C) Brandeis Consulting📁

Was ist ein(e) Objekt(instanz)?

Definition Wikipedia [1]

In der objektorientierten Programmierung wird eine Objektinstanz aus einer Klasse erzeugt und weist zur Laufzeit einen Datentyp auf. Zur Laufzeit wird dem „Objekt“ Speicher reserviert, in dem seine Daten und Methoden gespeichert werden.

  • Ein Keks ist eine individuelle Ausprägung der zugrundeliegenden Backform
  • Jeder Keks kann anders aussehen und hat seine eigene individuelle Dekoration

Keks

(C) Brandeis Consulting📁

Was ist ein Interface?

Definition Wikipedia [1]

Eine Schnittstelle oder ein Interface (englisch interface oder protocol) definiert in der objektorientierten Programmierung, welche Methoden in den unterschiedlichen Klassen u. Ä. vorhanden sind oder vorhanden sein müssen. Sie legt die Namen und die Signatur der Methoden, also die Parametertypen und den Rückgabetyp, fest.

  • Ein Interface wird oft auch als Vertrag bezeichnet, der die gewünschte Nutzung festlegt
  • Beim Backen von Keksen, wäre damit eine wichtige Anforderung an die Backform beschrieben:
    man muss damit Kekse ausstechen können

Keks

(C) Brandeis Consulting📁

Attribute, Methoden und Ereignisse

OOP Würfel

  • In der Objektorientierung gehören Daten und Methoden zusammen
  • Die Klasse definiert diese Daten als Attribute
  • Jede Objektinstanz kann so auf ihre eigenen Daten zugreifen
  • Methoden sind dazu da, Attribute der Objektinstanz zu lesen, zu schreiben oder Zustandsänderungen herbeizuführen
  • Zustandsänderungen können über Ereignisse mitgeteilt werden
(C) Brandeis Consulting📁

Übung "Würfelstruktur" - von der Struktur zum Objekt

Überblick

Es wird eine minimale Klasse erstellt, die nur öffentlich zugängliche Attribute bereitstellt - keine Methoden. Damit entspricht sie grundsätzlich einer Struktur und nicht den objektorientiertem Grundprinzip, dass Daten vor externem Zugriff geschützt werden sollten.

Lernziele

  • Klassen über Eclipse anlegen und bearbeiten
  • Attribute pflegen
  • Vergleich mit Strukturen herstellen
  • Objektorientierten und modernen ABAP Code verstehen
  • Kontakt mit einer SAP Standard API Klasse CL_ABAP_RANDOM

Würfelstruktur

(C) Brandeis Consulting📁

Übung Würfelstruktur: ABAP Code Definition

Definition

CLASS zcl_bc_aoo_##_die_str DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    DATA id TYPE string.
    DATA diced_number TYPE i.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_bc_aoo_##_die_str IMPLEMENTATION.
ENDCLASS.
  • Attribute werden im Abschnitt DEFINITION deklariert
  • Attribute der Objektinstanz beginnen mit DATA
  • Die SECTION entscheidet über die Sichtbarkeit von Attributen

  • Achtung:
    • öffentliche Attribute und der damit verbundene ungeschützte Zugriff sind in den meisten Fällen unerwünscht
    • Empfehlung: PROTECTED SECTION, um Vererbung zu ermöglichen oder bei Unischerheit PRIVATE SECTION
(C) Brandeis Consulting📁

Objektinstanzen im Debugger

Würfelstruktur im Debugger

  • Objektinstanzen haben zur Laufzeit einen Datentyp und einen eigenen Speicherbereich für Daten und Methoden
  • Objektinstanzen verhalten sich in Tabellen wie Strukturen
  • Man kann die einzelnen Datensätze "aufklappen"
  • Objektinstanzen sind im Debugger über {O:100*\CLASS=*} zu erkennen
  • Die Nummer identifiziert die Instanz eindeutig im aktuellen Modus
  • Im Debugger ist die Klasse als Actual Type angegeben
(C) Brandeis Consulting📁

Vergleich Struktur und Objekt

Struktur

Objekt

Datendefinition

    DATA: BEGIN OF ls_die_str,
            id           TYPE string,
            diced_number TYPE i,
          END OF ls_die_str.
    DATA lt_dice_str LIKE TABLE OF ls_die_str.
    DATA lt_dice_obj   TYPE TABLE OF REF TO zcl_bc_aoo_##_die_str.

Erzeugung

      ls_die_str-id             = lv_id.
      ls_die_str-diced_number   = lv_number.
      APPEND ls_die_str TO lt_dice_str.
      DATA(lo_die) = NEW zcl_bc_aoo_##_die_str(  ).
      lo_die->id                = lv_id.
      lo_die->diced_number      = lv_number.
      APPEND lo_die TO lt_dice_obj.

Datenzugriff

      ls_die_str = lt_dice_str[ sy-index ].
      out->write( |Struktur { ls_die_str-diced_number }| ).
      lo_die     = lt_dice_obj[ sy-index ].
      out->write( |Objekt  { lo_die->diced_number }| ).

  • Anlegen Objektinstanz: DATA(<instance>) = create <class>().
  • Sonst Datendefinition mit TYPE REF TO <class> (oder TYPE TABLE FOR REF TO <class>)
  • Zugriff auf Attribute einer Objektinstanz mit <instance>-><attribute
(C) Brandeis Consulting📁

Ausblick: SAP API Klassen und statische Methoden

Aus dem Beispiel:

DATA(lv_number)     = cl_abap_random=>create( seed = cl_abap_random=>seed( ) )->IntInRange( low = 1 high = 6 ).

Erklärung

cl_abap_random=>create( seed = cl_abap_random=>seed( ) )

  • Erzeugung eines Zufallsgenerators über die SAP Klasse CL_ABAP_RANDOM und deren statische Factory-Methode CREATE (Syntax: class=>method)
  • Der (eigentlich optionale) Parameter SEED wird mit einer statischen Methode SEED( ) der gleichen Klasse versorgt: cl_abap_random=>seed( )

intinrange( low = 1 high = 6 ).

  • Aus der zuvor erzeugten Objektinstanz des Zufallsgenerators wird die Methode intinrange( ) mit den Parametern low und high aufgerufen, die hier eine Integer-Zufallszahl zwischen 1 und 6 zurückgibt

DATA(lv_number)

  • Das Ergebnis der Methode IntInRange wird in die Variable lv_number geschrieben, die damit gleichzeitig deklariert wird
(C) Brandeis Consulting📁

Interpretation

Beispiel Methodenverkettung

DATA(lv_number)     = cl_abap_random=>create( seed = cl_abap_random=>seed( ) )->IntInRange( low = 1 high = 6 ).

Umgebauter längerer ABAP Code

* Erzeuge zufallswert (als Integer)
DATA(lv_seed) = cl_abap_random=>seed( ).

* Erzeugen eines Zufallsgenarators mit zufälligem Seed-Wert (als Objektinstanz)
DATA(lo_randomizer) = cl_abap_random=>create( seed = lv_seed ).

* erzeuge Zufallszahl als Integer im Bereich 1-6
DATA(lv_numnber) = lo_randomizer->IntInRange( low = 1 high = 6 ).

  • Durch eine solche Methodenverkettung kann man kürzeren und lesbaren ABAP Code erreichen
  • Allerdings nur für die Zielgruppe, die solchen Code lesen kann
  • Variablen, die eigentlich gar nicht gebraucht werden (z.B. lo_randomizer), werden nicht extra in Variablen gespeichert, obwohl sie im Hintergrund trotzdem erzeugt werden (anonyme Variablen)
  • Mit solchen Konstrukten kann man Debuggen im objektorientierten Kontext üben...
(C) Brandeis Consulting📁