ABAP Objects

Objektorientiertes ABAP für moderne Clean Core SAP Systeme

Kapselung (Encapsulation)

(C) Brandeis Consulting📁

Encapsulation / Kapselung

Kapselung

Definition Wikipedia

Als Datenkapselung ... bezeichnet man in der Programmierung das Verbergen von Daten oder Informationen vor dem Zugriff von außen. Der direkte Zugriff auf die interne Datenstruktur wird unterbunden und erfolgt stattdessen über definierte Schnittstellen (Black-Box-Modell).

Interpretation

Beispiel:

  • Attribute: id, diced_number
  • Methoden: getId(), roll(), getLastDicedNumber()
  • Ereignisse: onError, onResult
(C) Brandeis Consulting📁

Sichtbarkeiten

Sichtbarkeiten steuern den
Zugriff auf Attribute und Methoden:


  • Public
    • öffentlicher ungeschützter Zugriff für Alle
    • die Vorteile der objektorientierten Kapselung greifen hier nicht
  • Protected
    • Der Zugriff nur für Erben möglich
    • gewünschtes Erweiterungskonzept der Vererbung
  • Private
    • Der Zugriff für alle anderen - auch den Erben - ist strikt untersagt
    • Möglichkeit, Code und Daten zu schützen bzw. zu verstecken

Sichtbarkeiten

(C) Brandeis Consulting📁

Attribute

CLASS zcl_bc_aoo_##_die_enc DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

  PROTECTED SECTION.

  PRIVATE SECTION.
    DATA mv_id TYPE string.
    DATA mv_diced_number TYPE i.
ENDCLASS.

Beispiel aus der Übung:

  • Deklaration von Attributen mit DATA
  • Die SECTION entscheidet über die Sichtbarkeit der Attribute
  • Wenn keine Manipulation der Daten durch Vererbung gewünscht ist: PRIVATE SECTION
  • Hinweis zur Namenskonvention von Attributen:
    • Falls man Hungarian Notation einsetzt, ist M*_ ein üblicher Präfix für die Attribute einer Objektinstanz (z.B. MV_*, MS_*, MT_* )
    • Für statische Attribute (kommt später noch) wäre der übliche Präfix G*_
(C) Brandeis Consulting📁

Methoden

CLASS zcl_bc_aoo_##_die_enc DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    METHODS set_id IMPORTING iv_id TYPE string.
    METHODS get_last_diced_number RETURNING VALUE(rv_number) TYPE i.
    METHODS roll RETURNING VALUE(rv_number) TYPE i.
  PROTECTED SECTION.
    METHODS set_diced_number IMPORTING iv_number TYPE i.
  PRIVATE SECTION.
ENDCLASS.

Beispiel aus der Übung:

  • Deklaration von Methoden mit METHODS
  • Für den Zugriff auf Attribute spezielle SET- oder GET-Methoden vorsehen
  • Weitere Methoden (z.B. ROLL) bilden Fähigkeiten ab, die Zustandsänderungen und somit auch Änderungen der Attribute bewirken können
  • Der Ersteller einer Klasse entscheidet durch die Sichtbarkeit der Methoden, was mit der Objektinstanz ermöglicht werden soll
  • Methoden, die externe Aufrufer verwenden sollen, müssen public sein
(C) Brandeis Consulting📁

Übung: "Verkapselt"

Überblick

Die sehr einfache Würfelklasse wird jetzt vernünftig "verkapselt". D.h. die Daten werden vor externem Zugriff geschützt und sind nur noch durch entsprechende Methoden zugänglich.

Lernziele

  • Sichtbarkeiten bewusst einsetzen
  • Methodendefinition üben
  • Quickfixes verwenden: STRG+1
  • Objektorientierten ABAP Sourcecode verstehen

Verkapselt

(C) Brandeis Consulting📁

Methoden: Sichtbarkeiten

neu

CLASS zcl_abap_class DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC
  SHARED MEMORY ENABLED .

  PUBLIC SECTION.
    CLASS-METHODS: public_static_method.
    METHODS: public_method.
  PROTECTED SECTION.
    METHODS: protected_method.
  PRIVATE SECTION.
    METHODS: private_method.
ENDCLASS.

bisher

Class Methods

  • Spalte Sichtbarkeit im SAPGUI wird zu SECTION mit verschiedenen Sichtbarkeiten
  • Die Implementierung erfolgt im Eclipse direkt im Sourcecode im gleichen Fenster
  • Es wird leichter, wenn man vorher die Bedienung von Eclipse kennenlernt
  • Ausblick: Statische Methoden werden durch CLASS-METHODS: statt METHODS: bei eingeleitet
(C) Brandeis Consulting📁

Methoden: Parameter

neu

  methods EXAMPLE_METHOD
    importing
      value(ID_USER_BY_VALUE) type USER default SY-UNAME
      ID_STRING_BY_REFERENCE type STRING optional
      IO_REF_TO_OBJECT type ref to OBJECT
    exporting
      value(ER_REF_TO_DATA) type ref to DATA
      value(ED_INT_BY_VALUE) type I
      EV_BY_REFERENCE type STRING
    changing
      value(CD_DATA_BY_VALUE) type DATA
      CS_T001_BY_REFERENCE type T001 optional
    returning
      value(RV_SUCCESS) type ABAP_BOOLEAN
    raising
      CX_STATIC_CHECK .

bisher

Methodenparameter

  • Analog zu Funktionsbausteinen: IMPORTING vs. EXPORTING vs. CHANGING
  • NEU: RETURNING - Nicht mehr bei ABAP Objects Klassen: TABLES
  • Wertübergabe durch VALUE(), sonst Referenzübergabe (TYPE REF TO ist immer Referenzübergabe)
  • verschiedene Präfixe bei den Parametern - sehr unterschiedliche Umsetzung - eigene Richtlinien sinnvoll
  • zusätzlich: optionale Parameter, Vorschlagswerte und Ausnahmen
(C) Brandeis Consulting📁

Methoden: RETURNING Parameter

RETURNING-Parameter liefern genau ein Ergebnis mit einem konkreten Datentyp an den Aufrufer zurück. Das ermöglicht kürzeren lesbaren ABAP Code. Methoden können so als funktionale Methoden oder Ausdruck verwendet werden. Die Methodenverkettung wird unterstützt.

Verwendung als funktionale Methode

Deklaration

methods roll RETURNING VALUE(rv_number) type i.

Verwendung

data(lv_number) = lo_die->roll( ).

Verwendung als Ausdruck

Deklaration

methods is_valid RETURNING VALUE(rv_valid) type ABAP_BOOLEAN.

Verwendung

if lo_obj->is_valid( ) = abap_false.
  return.
endif.  

Verwendung der Methodenverkettung

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

Erzeugung und Verwendung von Objektinstanzen

Datendeklaration

DATA lo_die    TYPE REF TO zcl_bc_aoo_##_die_enc.
DATA lt_dice   TYPE TABLE OF REF TO zcl_bc_aoo_##_die_enc.

Erzeugung von Objektinstanzen

DO 10 TIMES.
  DATA(lv_id) = |{ sy-index }|.
  DATA(lo_die_new) = NEW zcl_bc_aoo_##_die_enc(  ).
  lo_die_new->set_id( lv_id ).
  out->write( |Würfel { lv_id }: { lo_die_new->roll(  ) }| ).
  APPEND lo_die_new TO lt_dice.
ENDDO.

Verwendung

DO 10 TIMES.
  DATA(lv_index) = sy-index.
  lo_die  = lt_dice[ lv_index ].
  DATA(lv_descr) = lo_die->get_description(  ).
  out->write( |Würfel { lv_index } '{ lv_descr }': { lo_die->get_last_diced_number( ) }| ).
ENDDO.
  • Beispiel aus der Übung leicht angepasst
  • Datendeklaration mit TYPE REF TO <class>
  • Datendeklaratrion von Tabellen mit TYPE TABLE OF REF TO <class>
  • Erzeugen einer neuen Objektinstanz mit new <class>( )
    Hinweis: weitere Möglichkeiten folgen
  • Verwendung der Inline Datendeklaration ist möglich und empfohlen: DATA(lo_instance) = new <class>( )
  • Objektinstanzen werden als normale Variablen behandelt und können wie gewohnt verwendet werden, z.B. in Tabellen
  • Zugriff auf Attribute und Methoden von Objektinstanzen mit obj-><attribute> bzw. obj-><method>( )
(C) Brandeis Consulting📁

UML für Dokumentation und Visualisierung

classDiagram
    class Die{
      -String id
      -int diced_number
      +set_id(id)
      +int get_last_diced_number()
      +int roll()
      =set_diced_number(number)
    }

  • die Unified Modeling Language (UML) wird häufig in der Objektorientierung für die Visualisierung von Klassen und deren Beziehungen untereinander verwendet
  • Mit Tools wie https://mermaid.live ist ein einfacher Einstieg möglich
  • Beispiel aus der Übung als Mermaid ClassDiagram
  • Sichtbarkeiten:
    +: public, =: protected, -: private
  • Methoden mit (), Attribute ohne

UML Grafik

(C) Brandeis Consulting📁