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
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
- help.sap.com – Quick Assist – https://help.sap.com/doc/saphelp_nw75/7.5.5/en-us/4e/c1d7ba6e391014adc9fffe4e204223/frameset.htm
- help.sap.com – Refactoring – https://help.sap.com/doc/saphelp_nw75/7.5.5/en-us/ce/178e5425364f51994f2c7f634cb56c/frameset.htm
- Refactoring (Martin Fowler) – https://refactoring.com/
Zusammenfassung
Es gibt nur eins: Jetzt wird gerefactored!