Refactoring mit den ABAP® Development Tools

In diesem Blog werde ich auf die wichtigsten bzw. interessantesten Refactoring Funktionen der ABAP Development Tools eingehen. Ich werde an dieser Stelle nicht weiter ausführen was Refactoring an sich ist bzw. warum wir unsere Entwicklungen regelmäßig einem Refactoring unterziehen sollten. Wer sich darüber informieren will, der soll bitte Googlen oder sich das Buch „Refactoring“ von Martin Fowler besorgen.

Bevor wir uns nun mit ADT beschäftigen, schauen wir mal, ob bzw. wie man bereits in der SE24 den Code überarbeiten kann bzw. ob es auch da schon ein Tool gibt?

Refactoring in der SE24

Ja, gibt es – Aber nur sehr wenige Entwickler kennen den Refactoring Assistent in der SE24. Mit Hilfe dieses Asistenten können Attribute oder Methoden einer Klasse in eine Superklasse oder ein Interface verschoben werden. Das war es dann aber auch schon wieder.

In einigen sehr alten Blogs ist noch von weiteren Funktionen die Rede, bei meinen Tests in aktuellen Systemen konnte ich jedoch keine der erwähnten Möglichkeiten vorfinden.

Ich gehe daher davon aus, dass dieses Tool irgendwann einmal da war und dann zumindest teilweise wieder entfernt wurde.

ABAP Development Tools

Nun aber zum eigentlichen Thema. Die Vorteile von ADT gegenüber der SE80 aufzuzählen, sprengt diesen Rahmen – aber ein wesentlicher Unterschied sind die umfangreichen Tools die so eine moderne IDE liefert. Und die Unterstützung des Refactoring-Prozesses mit dem Quick Assist ist dabei nur ein Aspekt.

Quick Assist

ADT stellt mit dem Quick Assist eine große Anzahl von Funktionen zur Verfügung die uns bei der Verbesserung unserer Entwicklungen unterstützen. Die zur Verfügung gestellten Funktionen können im groben in die zwei Bereiche eingeteilt werden:

  • ABAP Refactoring um die Struktur des Source Codes zu verbessern
  • ABAP Quick Fixes um Fehler oder Warnung zu beheben

Ergänzend dazu gibt es noch Quick Assists welche weder das eine noch das andere sind. Dazu zählen z.B. das Generieren von CONSTRUCTOR oder FACTORY Methoden oder die Erstellung von Text Symbolen. Ziemlich cool finde ich auch das Erzeugen von SET- bzw. GET-Methoden für ein Attribut.

Der Quick Assist/Quick Fix kann an jeder Stelle des Codes entweder über STRG 1 oder über das Kontextmenü aufgerufen werden:

Quick Assist View

Es gibt auch einen Quick Assist View welcher über STRG Shift 1 eingeblendet werden kann:

Ergänzenden zum Popup wird im View die zuletzt vorgenommene Anpassung im Bereich Previous Result angezeigt. Man kann hier direkt zu den veränderten oder erzeugten Elementen verzweigen. Im View werden die möglichen Quick Assists kontextabhängig permanent aktualisiert. Das Layout und die anzuzeigenden Inhalte des Views kann man über die Toolbar individuell anpassen.

Quick Assist Funktionen

Aktuell (ABAP 7.54 und ADT 3.10) gibt es um die 50 verschiedene Quick Assist Funktionen. Nachfolgend werde ich auf jene Funktionen eingeben, die uns beim Überarbeitung der Codes – dem Refactoring – unterstützen.

Umbenennen von Bezeichnern

Eine der wichtigsten Regeln für sauberen und lesbaren Code sind wohlüberlegte und aussagekräftige Namen für Methoden, Variablen oder auch Form Routinen. Mit der Quick Assist Funktion Rename können diese Bezeichner entweder nur lokal im aktuellen Source Code oder zusätzlich in allen anderen Source Codes wo die Komponente verwendet wird umbenannt werden.

Die beiden Funktionen können auch über die Shortcuts ALT SHIFT R oder STRG 2, R direkt aufgerufen werden. Zudem befindet sich die Funktion auch im Kontextmenü.

Variablen oder Konstanten extrahieren oder konvertieren

Zur Erstellung oder Änderung von Variablen existieren viele Möglichkeiten:

  • Lokale Variablen aus einer Expression erzeugen
  • Lokale Variable in ein Klassen Element umwandeln (Attribut oder Konstante)
  • Lokale Variable in einen Methodenparameter umwandeln
  • Lokale Variable aus einem funktionalen Methodenaufruf generieren
  • Inline deklarierte Variable in explizite Variable umwandeln
  • Nicht verwendete Variablen löschen
  • Konstanten aus einer Variable erzeugen
  • Bestehende Konstanten wiederverwenden

Nachfolgend ein Beispiel wie aus einer Expression eine lokale Variable erzeugt wird:

Und hier noch ein Beispiel, wie aus einer Variable eine Klassenkonstante erzeugt wird:

Methoden extrahieren

Vielleicht die wichtigste und hilfreichste Refactoring Funktion ist das Extrahieren von Codesegmenten oder einer markierten Expression in eine neu Methode.

Man kann neue Methoden aus einem markierten Codebereich oder aus einer markierten Expression generieren. Klingt nach nicht viel, ist aber vielleicht die wichtigste Refactoring Funktion überhaupt.

Verwirrend ist hier der Umstand dass die im Quick Assist View auswählbare Funktion Extract Method lediglich den Code in eine neue private Methode extrahiert. Es gibt jedoch zusätzlich die Möglichkeit mit ALT SHIFT M oder dem Kontextmenü einen Wizard für die Extraktion aufzurufen. Hier können detaillierte Angaben zur zu erstellenden Methode vorgenommen werden:

Wenn im zu extrahierenden Code mit impliziten Datendefinitionen oder impliziten Feldsymbolen gearbeitet wird, kann es bei der Generierung zu Problemen kommen. Um diese impliziten Definitionen in Explizite umzuwandeln gibt es glücklicherweise auch einen Quick Assist:

Methoden und Attribute verschieben

Manchmal muss die Sichtbarkeit verändert werden oder Methoden sollen in ein Interface verschoben werden. Um dies zu erreichen, gibt es folgende Quick Assists:

  • Sichtbarkeit von Methoden, Attributen oder Konstanten ändern
  • Methoden, Attribute oder Konstante in die Superklasse verschieben
  • Methoden, Attribute oder Konstante in ein Interface verschieben.

Im nachfolgenden Beispiel wird eine Methode in ein Interface verschoben:

Um die Sichtbarkeit eines Attributes oder eine Methode zu ändern, genügt es natürlich auch im Source Code der Klassendefinition das entsprechende Objekt per cut/past in einen anderen Sichtbarkeitsbereich zu verschieben.

Ausnahmenbehandlung

Das mit den Ausnahmen ist in ABAP so eine Sache. Sehr oft werden Ausnahmen gar nicht, teilweise oder einfach falsch eingesetzt. Die meisten Quick Assists für Ausnahmen sind leider erst mit 7.50 zur Verfügung.

Unter anderem können folgende Quick Assists verwendet werden:

  • Unbehandelte Ausnahmen in die Methodensignatur aufnehmen
  • TRY/CATCH für einen markierten Bereich erzeugen
  • Catch Variable extrahieren

Links

Zusammenfassung

Es gibt nur eins: Jetzt wird gerefactored!