ABAP - Schlüsselwortdokumentation →  ABAP - Programmierrichtlinien →  Architektur →  Objektorientierte Programmierung → 

Lokale Typen für globale Klassen

Hintergrund

Innerhalb von Class-Pools können wie in fast jedem anderen ABAP-Programm Datentypen, lokale Interfaces und lokale Klassen definiert werden, um die Implementierung der globalen Klasse besser zu strukturieren. Technisch gesehen bilden diese optionalen Deklarationsteile gemeinsam mit dem Deklarationsteil der globalen Klasse den globalen Deklarationsteil des Class-Pools.

Diese lokalen Deklarationen eines Class-Pools sind außerhalb des Class-Pools unsichtbar und können daher nur wie folgt verwendet werden:

Diese beiden Verwendungsarten haben unterschiedliche technische Sichtbarkeitsanforderungen, da Freunde einer globalen Klasse Zugriff auf ihren privaten Sichtbarkeitsbereich haben. In der PRIVATE SECTION verwendete lokale Typdeklarationen müssen also etwaigen Freunden der Klasse zugänglich gemacht werden, während solche Typdeklarationen; die ausschließlich innerhalb der Methodenimplementierungen verwendet werden, für andere Klassen vollkommen bedeutungslos sind.

Lokale Klassen bestehen im Allgemeinen neben ihrem Deklarationsteil auch aus zugehörigen Methodenimplementierungen. Diese sind auch für Freunde der globalen Klasse unsichtbar und haben damit technisch die gleichen Sichtbarkeitsanforderungen wie lokale Typdeklarationen, die nur innerhalb der Implementierung Verwendung finden.

Lokale Datentypen, Interfaces und Klassen innerhalb eines Class-Pools werden in speziell dafür vorgesehenen Include-Programmen ablegt. Hierbei wird zwischen den folgenden beiden Bereichen unterschieden:

Diese Bereiche entsprechen den unterschiedlichen technischen Sichtbarkeitsanforderungen. Die internen Namen der Include-Programme enden mit CCDEF bzw. CCIMP, weshalb auch von den CCDEF- bzw. CCIMP-Includes gesprochen wird.

Regel

Lokale Deklarationen geeignet platzieren

Platzieren Sie die lokalen Deklarationen eines Class-Pools abhängig von den Anforderungen an geeigneter Stelle. Typen, die nur innerhalb der Implementierung der globalen Klasse verwendet werden, gehören an eine andere Stelle als Typen, die auch in der PRIVATE SECTION der globalen Klasse angesprochen werden.

Details

Aus Sicht eines Class-Pools können alle lokale Typdefinitionen und zugehörigen Implementierungen lokaler Klassen im Bereich Klassenrelevante lokale Definitionen abgelegt werden. Ein solches Vorgehen ist aber aus Sicht der Abhängigkeitsverwaltung ungünstig. Nur bei Änderungen an den lokalen Typdeklarationen eines Class-Pools, die in der PRIVATE SECTION der globalen Klasse verwendet werden, müssen abhängige Klassen (Unterklassen und Freunde der globalen Klasse) invalidiert und neu generiert werden. Technisch erfolgt diese Invalidierung aber bei allen Änderungen im Bereich Klassenrelevante lokale Definitionen (CCDEF-Include). Aus diesem Grund gibt es den zusätzlichen Bereich Lokale Definitionen/Implementierungen (CCIMP-Include), der für lokale Typdeklarationen, die lediglich innerhalb der Klassenimplementierung der globalen Klasse Verwendung finden, sowie für den Implementierungsteil lokaler Klassen vorgesehen ist. Bei Änderungen in diesem Bereich werden abhängige Klassen nicht invalidiert.

Um nach Änderungen an einer globalen Klasse unnötige Neugenerierungen anderer Klassen zu vermeiden, die auf ungewollten technischen Abhängigkeitsbeziehungen beruhen, müssen daher die sogenannten klassenlokalen Typen im Class Pool jeweils an den geeigneten Stellen definiert werden:

Deklaration und Implementierung einer lokalen Klasse sollen also nur dann auf die Bereiche Lokale Definitionen/Implementierungen und Klassenrelevante lokale Definitionen aufgeteilt werden, wenn auf sie in der PRIVATE SECTION Bezug genommen werden soll. Wird die lokale Klasse hingegen ausschließlich innerhalb der Implementierung der globalen Klasse verwendet, sollen sowohl Deklaration als auch Implementierung im Bereich Lokale Definitionen/Implementierungen erfolgen.

Anmerkung

Die hier aufgeführte Regel spezialisiert die allgemeine Regel globale Deklarationen an zentraler Stelle vorzunehmen in Hinsicht auf Class-Pools. Diese sind insbesondere auf den externen Aufruf der Methoden ihrer jeweiligen globalen Klasse ausgerichtet und daher in besonderem Maße in ein Abhängigkeitsgeflecht eingebunden. Aus diesem Grund kann die gerade erwähnte Regel hier nicht in voller Strenge gelten.

Hinweis

Testklassen sollten ausschließlich in Test-Includes angelegt werden.