Trotzdem haben meiner Ansicht nach lokale Klassen durchaus ihre Daseinsberechtigung, insbesondere wenn es um kleinere Funktionalitäten gibt, die nur im Kontext des einen Reports Sinn machen - z.B. bei nicht wirklich ABAP-OO-fähige Dynprosteuerung, SALV-Klassen, GUI-Status, etc. Auch wenn ein Report globale Klassen verwendet kann es sinnvoll sein, den Ereignis-Ablauf im Report mit einer lokalen Klasse mit PBO, PAI, INIT, etc. - Methoden zu strukturieren.Global als Standard, lokal nur im Bedarfsfall
Arbeiten Sie standardmäßig mit globalen Klassen. Verwenden Sie lokale Klassen nur, wo geeignet.
Globale Klassen sind die Klassen, die im Data Dictionary sichtbar sind. Lokale Klassen existieren innerhalb des Includes eines anderen Entwicklungsobjekts und sind nur für dieses andere Objekt sichtbar.
Lokale Klassen eignen sich
für sehr spezifische private Datenstrukturen, z.B. einen Iterator für die Daten der globalen Klasse, der ausschließlich hier benötigt wird,
um einen komplexen privaten Algorithmus zu extrahieren, z.B. zur Trennung dieses speziellen Multi-Methoden-Sortier-Aggregat-Algorithmus vom Rest des Codes Ihrer Klasse,
damit bestimmte Aspekte der globalen Klasse gedoublet werden können. So kann man beispielsweise alle Datenbankzugriffe in eine separate lokale Klasse extrahieren, die in Unit Tests dann durch ein Test-Double ersetzt werden kann.
Lokale Klassen verhindern die Wiederverwendung, weil sie nicht an anderer Stelle verwendet werden können. Obwohl sie einfach zu extrahieren sind, ist es schwer, sie überhaupt zu finden. Dies führt zu unerwünschter Codeduplizierung. Orientierung, Navigation und Debugging in sehr langen Includes lokaler Klassen sind mühsam und lästig. Da ABAP auf Include-Ebene sperrt, können an den verschiedenen Teilen des lokalen Includes nicht mehrere Personen gleichzeitig arbeiten (was möglich wäre, wenn es sich um separate globale Klassen handeln würde).
Überdenken Sie Ihre Verwendung von lokalen Klassen, wenn
- Ihr lokales Include Dutzende von Klassen und Tausende von Codezeilen umfasst,
- Sie globale Klassen als „Pakete“ betrachten, die andere Klassen enthalten,
- Ihre globalen Klassen zu leeren Hülsen degenerieren,
- Sie doppelten Code über separate lokale Includes hinweg wiederholt finden,
- Ihre Entwickler beginnen, sich gegenseitig auszusperren, und zunehmend unfähig werden, parallel zu arbeiten,
- Ihre Backlog-Schätzung durch die Decke geht, weil Ihre Teams die lokalen Includes der jeweils anderen Teams nicht mehr verstehen
Dem schließe ich mich an.
Ich nicht. Die Includes für die anderen Elemente kommen auch nur daher, dass die SE80 das bei der Anlage automatisch vorschlägt und es schneller geht, zweimal ENTER zu drücken, als die Option mit der Maus abzuwählen. Finde ich auch doof, dass man das Verhalten nirgends deaktivieren kann.
Ich verwende für "normale" Reports gar keine Includes, es sei denn sie werden zu groß. Dann versuche ich sinnvolle "Einheiten" in Includes auszulagern, wobei sich hier dann Klassen oder alles was mit der Selektionsbildverarbeitung zu tun hat anbieten. Und ich trenne dann üblicherweise in einen Include mit allen Klassendefinitionen und einen (oder mehrere bei sehr! groß gewordenen Programmen ) mit allen Implementierungen.
Da ich heutzutage Reports ohne FORM-Routinen schreibe, benötige ich halt Klassen um das Coding zu strukturieren. Da die Klasse erst mal nur für dieses eine Programm benötigt wird, wird sie auch nur lokal angelegt. Das entspricht in etwa den alten FORM-Routinen, die ja auch üblicherweise nur für ein Programm gedacht waren.
Lokale Klassen: Meist Jacke wie Hosesap_enthusiast hat geschrieben: ↑30.11.2022 13:28Ich würde mich mit einer weiteren Fragestellung an euch wenden.
Wie steht ihr zu statischen bzw. Instanzmethoden? Ist es generell falsch, statische Kapselung zu bevorzugen?
sap_enthusiast hat geschrieben: ↑30.11.2022 13:28Ich würde mich mit einer weiteren Fragestellung an euch wenden.
Wie steht ihr zu statischen bzw. Instanzmethoden? Ist es generell falsch, statische Kapselung zu bevorzugen?
Dem muss ich aber wiedersprechen.ralf.wenzel hat geschrieben: ↑30.11.2022 17:00Ich arbeite streng nach dem Prinzip "ich löse ein Problem im System nur einmal" und das geht mit lokalen Klassen nicht.
Ich versuche eigentlich immer Instanz-Methoden zu verwenden, da dies Sinn und Zweck von OO ist. Darüber hat sich mal ein anderer Entwickler beschwert, weil ich in meinem DAO nur mit Instanze-Methoden gearbeitet habe und lieber die die Methoden direkt (ohne Instanz) verwendet hätte. Damals noch als globale Klasse. Ich nutze das DAO z.B. dafür, dass ich die Datenzugriffschicht (ohne Logik) einfach mal komplett gegen eine DAO-Mock-Klasse austauschen kann, um damit Unit-Test laufen lassen zu können. Hier machen aber Statische Methoden keinen Sinn, da ich mir die Instanz auf ein Interface packe.sap_enthusiast hat geschrieben: ↑30.11.2022 13:28Wie steht ihr zu statischen bzw. Instanzmethoden? Ist es generell falsch, statische Kapselung zu bevorzugen?
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
msfox