ABAP Cloud - Deprecation Flow
Welche Hilfemittel stehen dir in ABAP Cloud zur Verfügung, um Objekte freizugeben oder auch auf veraltet zu setzen? Schauen wir uns einmal die Details an.
Inhaltsverzeichnis
Wie kannst du einfach und sauber mit Schnittstellen und genutzten Objekten im System umgehen? In diesem Artikel werden wir auf den aktuellen Objektlebenszyklus innerhalb von ABAP Cloud eingehen.
Einleitung
In ABAP Cloud arbeiten wir sehr stark mit Software Komponenten, kurz SWC, und geben zwischen den Komponenten unsere Objekte über sogenannte Verträge (Contract) frei. Diese freigegebenen APIs kann dann jeder im System nutzen. Dabei gehen wir den Vertrag ein, dass das Objekt stabil bleibt. Damit sollten wir Änderungen vermeiden, die bestehenden Code kaputt machen, wie zum Beispiel:
- Löschen von Methoden
- Erweiterung von bestehenden Methoden um neue Pflichtparameter
Mehr zum Thema "Stabile ABAP APIs" findest du in der SAP Community von Lars Hvam.
Vorbereitung
Für die Demonstration legen wir zuerst einmal zwei einfache Objekte im System an. Dabei erstellen wir eine Utility Klasse, um uns den aktuellen Zeitstempel zurückgeben zu lassen.
CLASS zcl_bs_demo_timestamps DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_bs_demo_timestamps.
ENDCLASS.
CLASS zcl_bs_demo_timestamps IMPLEMENTATION.
METHOD zif_bs_demo_timestamps~get.
GET TIME STAMP FIELD rd_result.
ENDMETHOD.
ENDCLASS.
Zu jeder Klasse gehört auch ein entsprechendes Interface, damit wir gleich noch ein testbares Objekt erstellen. Im Interface definieren wir den Typen, die Methode und hinterlegen gleich noch eine Dokumentation mit ABAP Docs.
INTERFACE zif_bs_demo_timestamps
PUBLIC.
TYPES td_timestamp TYPE timestampl.
"! Get current timestamp in TIMESTAMPL format
"! @parameter rd_result | Actual timestamp
METHODS get
RETURNING VALUE(rd_result) TYPE td_timestamp.
ENDINTERFACE.
Freigabe
Damit wir nun das Objekt außerhalb unserer SWC nutzen können, müssen wir es zuerst einmal freigeben. Dazu rufen wir das Objekt auf und wechseln in den View "Properties" und in den Reiter "API State".
Über den Plus (+) Button legen wir einen neuen Contract an. Wenn du das Objekt in ABAP Cloud nutzen willst, dann lässt du die Checkbox bei "Use in Cloud Development". Wenn du die Klasse auch in den Keyuser Apps verwenden willst, kannst du auch das Flag bei "Use in Key User Apps" setzen.
Zum Abschluss erfolgt noch eine Prüfung, ob das Objekt entsprechend freigegeben werden kann und eine Zuordnung zu einem entsprechenden Transportauftrag. Zum Abschluss finden wir nun auf dem Reiter "API State" den neuen Contract für das Objekt.
Diesen Vorgang wiederholen wir nun noch für die Klasse, erhalten hier aber eine entsprechende Meldung, dass die Instanziierung auf PRIVATE stehen sollte. Dies Meldung kannst du mit einer Factory oder einer Factory Methode lösen.
Zum Abschluss verwenden wir die Klasse und lassen uns einen Zeitstempel zurückgeben, den wir ausgeben können. Die Klasse können wir in allen SWC verwenden, da sie einen C1 Contract hat.
DATA lo_timestamp TYPE REF TO zif_bs_demo_timestamps.
lo_timestamp = NEW zcl_bs_demo_timestamps( ).
out->write( lo_timestamp->get( ) ).
Veraltet
Nun kommt im Laufe der Nutzung eines Objektes der Zeitpunkt, da möchtest du, als Entwickler, das Objekt modernisieren, erweitern oder neu zur Verfügung stellen. In so einem Fall wirst du das bestehende Objekt aber nicht verändern, da dieses noch in bestehendem Code verwendet wird und die die Stabilität nicht gefährden willst. In so einem Fall greifen wir auf den Deprecation Flow zurück, damit geben wir dem Verwender das Signal, dass die verwendete API veraltet ist.
Nachfolger
Dazu entwickeln wir zuerst einmal die neuen API im System. In unserem Beispiel wollen wir den alten Timestamp nicht mehr verwenden, sondern auf den UTCLONG setzen. Dazu definieren wir das folgende Interface:
INTERFACE zif_bs_demo_utc_timestamps
PUBLIC.
TYPES td_timestamp TYPE utclong.
"! Get current timestamp in UTCLONG format
"! @parameter rd_result | Actual timestamp
METHODS get
RETURNING VALUE(rd_result) TYPE td_timestamp.
ENDINTERFACE.
Im zweiten Schritt implementieren wir die neue Klasse und verwenden in diesem Fall die Funktion UTCLONG_CURRENT, um an den aktuellen Zeitstempel zu gelangen.
CLASS zcl_bs_demo_utc_timestamps DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_bs_demo_utc_timestamps.
ENDCLASS.
CLASS zcl_bs_demo_utc_timestamps IMPLEMENTATION.
METHOD zif_bs_demo_utc_timestamps~get.
rd_result = utclong_current( ).
ENDMETHOD.
ENDCLASS.
Zum Abschluss nicht vergessen, die neuen Objekte als API zur Verfügung zu stellen und den C1 Contract zu erstellen (wie schon in den Schritten zuvor).
Workflow
Nun müssen wir die aktuellen Objekte auf veraltet setzen, dazu gehen wir wieder in das Objekt in den "Properties" View. Über den "Edit" Button können wir den aktuellen Vertrag noch einmal bearbeiten.
Dazu setzen wir den Status (Release State) des Objekts auf "Deprecated".
Im nächsten Schritt können wir nun einen oder mehrere Nachfolger angeben. Hier können wir nach unserem neuen Interface suchen und dieses hinterlegen. Im Feld "Concept Name" kannst du per Freitext ein Kommentar bzw. ein ganzes Konzept hinterlegen.
Nachdem der Contract aktualisiert wurde, finden wir die aktuellen Informationen unter "API State" aufgelistet.
Diesen Vorgang wiederholen wir noch für die Klasse, setzen diese auf Veraltet und hinterlegen den Nachfolger.
Sichtbarkeit
Zum Abschluss schauen wir uns noch die Klasse an, die unsere freigegebene API nutzt. Welche Informationen erhält der Verwender von der IDE? Sobald wir die Klasse öffnen, erhalten wir zwei Warnmeldungen im Code:
Die Meldung verweist uns auch gleich an das neue Interface bzw. die neue Klasse.
Hinweis: Zusätzlich gibt es auch eine Prüfung im ABAP Test Cockpit, womit wir steuern können, ob auch veraltete APIs genutzt werden können oder ob diese durch den Ausnahmeprozess laufen sollten.
Vollständiges Beispiel
Hier noch einmal die vollständige Klasse, die unsere veraltete API nutzt. Damit kannst du das Beispiel in diesem System einfacher nachstellen.
CLASS zcl_bs_demo_use_depr_flow DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_bs_demo_use_depr_flow IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA lo_timestamp TYPE REF TO zif_bs_demo_timestamps.
lo_timestamp = NEW zcl_bs_demo_timestamps( ).
out->write( lo_timestamp->get( ) ).
ENDMETHOD.
ENDCLASS.
Fazit
Der Deprecation Flow hilft dir bei der Verwaltung von freigegebenen Objekten im System und zeigt anderen Entwicklern, welche Objekte ohne Probleme verwendet werden können oder welche Objekte mittlerweile veraltet sind.