Die Code-Generierung erfolgt interaktiv mit dem Programmierer. Das Modul Code- Generator in ConceptBase erzeugt die Code-Fragmente, die dem Programmierer zur Auswahl dargestellt werden. Des weiteren übernimmt das Modul die Verwaltung von bereits definierten Programmierschnittstellen, denn fertige Programmierschnittstellen können in ConceptBase als Telos-Objekte abgespeichert werden. Der CodeGenerator ist weitgehend unabhängig von den anderen Modulen in ConceptBase. Während der Erzeugung des Programmcodes sind lediglich Zugriffe auf den Objektspeicher notwendig, um die Struktur einer Sicht zu ermitteln. Das Programm API Designer ist die Benutzerschnittstelle für den Code-Generator in ConceptBase und wird im nächsten Abschnitt beschrieben.
Die Erstellung des Programmcodes erfolgt in vier Schritten:
Der Code-Generator erstellt den Programmcode für die Programmierschnittstelle aus Schablonen. In diese Schablonen müssen nur noch die Typbezeichnungen für eine konkrete Sicht eingetragen werden. Aus den Schablonen können nicht direkt vollständige C++-Klassen generiert werden. Zunächst erzeugt der Code-Generator nur Fragmente dieser Klassen. Die einzelnen Fragmente enthalten zum Beispiel die Konstruktoren und Destruktoren, den Klassennamen, die Vererbungsdeklarationen, öffentliche und private Methoden einer Klasse usw. Nachdem alle Fragmente durch den Programmierer ausgewählt und editiert worden sind, stellt der Code-Generator aus den Fragmenten die vollständigen C++-Klassen zusammen.
Die vom CodeGenerator erstellten Code-Fragmente sind vollständig und müssen nicht unbedingt vom Programmierer geändert werden. Das Editieren der Fragmente ist möglich, damit der Programmierer die Programmierschnittstelle leichter in sein Programm integrieren kann und keine Nachbearbeitung der generierten Dateien notwendig ist. So kann der Programmierer zum Beispiel in den Änderungsmethoden eigene Methoden zum Neuzeichnen der geänderten Objekte aufrufen. Allerdings ist der Programmierer selbst dafür verantwortlich, daßseine Änderungen korrekt sind.
Bei der Code-Generierung wird auch die Struktur der Sicht analysiert. Stellt der Code-Generator zum Beispiel fest, daßein Attribut für die Objekte einer Klasse immer eindeutig bestimmt ist, so wird für das Attribut eine Alternative erstellt, bei der Typ des Attributs in C++ keine Menge darstellt. Ähnliches gilt für Attribute, die die atomaren Typen Integer, Real und String haben. Bei diesen Typen mußnicht die obengenannte Klasse CBobjectName benutzt werden, sondern die C++-Datentypen int, float und char sind für die Darstellung in C++ besser geeignet.
Der Programmierer kann die Code-Fragmente für die Programmierschnittstelle einer Sicht in ConceptBase als Telos-Objekte speichern. Der Programmcode eines Fragments wird dabei als String gespeichert. Abbildung 7.4 zeigt die Modellierung der zugehörigen Klassen in Telos. Die Definition des Telos-Modells ist vollständig in Anhang C angegeben.
Abbildung 7.4: Modellierung der Code-Fragmente in Telos
Die Instanzen der Klassen dieses Modells werden aus der Sichtendefinition generiert. Eine Programmierschnittstelle für eine Sicht ist eine Instanz der Klasse CppViewApi. Zu jedem Objekt dieser Klasse gehört genau eine Instanz der Klasse CppViewAdmin und CppMainView, die die Kommunikationsschnittstelle und die Hauptklasse der Sicht in C++ beschreiben. Die Klasse CppSubView definiert die C++-Klasse einer Teilanfrage. Da dafür die gleichen Fragmente wie bei der Hauptklasse der Sicht spezifiziert werden müssen, ist CppSubView eine Spezialisierung von CppMainView. Die Klasse CppAttribute stellt ein Attribut in der Sicht dar. Dafür wird keine C++-Klasse generiert, sondern das Attribut wird als Objektvariable in die entsprechende C++-Klasse einer Sicht oder Teilanfrage integriert.
Die Attribute der Klassen CppViewAdmin, CppSubView, CppMainView und CppAt- tribute stellen die Code-Fragmente dar und sind vom Typ String. Die vom Code-Generator erstellten vollständigen Klassen werden nicht in ConceptBase gespeichert.
Zu einer Sicht in ConceptBase kann es mehrere verschiedene Programmierschnittstellen geben. Bei einem Objekt der Klasse CppViewApi wird die zugehörige Sicht als Attribut itsView gespeichert.
Aus einem CppViewAdmin-Objekt erstellt der Code-Generator eine Spezialisierung der Klasse CBviewAdmin. Auch wenn die handleInsert/Delete-Methoden hier als Attribut der Klassen CppMainView und CppAttribute modelliert sind, wird der Programmcode der Funktionen in die Spezialisierung der CBviewAdmin-Klasse integriert.
Für jede Instanz der Klassen CppMainView und CppSubView wird analog eine Spezialisierung der Klassen CBview und CBsubView mit den zugehörigen Attributen erstellt. Alle Klassendeklarationen schreibt der CodeGenerator dann in Header-Dateien, die direkt in einem C++-Programm verwendbar sind. Die vordefinierten Klassen (z.B. CBview) sind in der Programm-Bibliothek libCBview enthalten, die zu dem Programm hinzugebunden werden muß.
Christoph Quix