4 Code-Generierung


[Seminarübersicht]...[CASE-Tool Rational Rose]...[Rational Rose/C++]...[5 Multi-User-Betrieb]

  1. Code-Generation Properties
  2. C++-Code-Generierung
  3. DDL-Code-Generierung
  4. IDL-Code-Generierung


  1. Code Generation Properties

    Das Ziel der Modellierung eines Systems ist, das Modell solange wie möglich unabhängig von der Zielsprache zu entwickeln und das Modell nicht abhängig von den "Fähigkeiten" der Zielsprache zu machen.

    Die Code-Generierung stellt den Beginn der Implementierungsphase im Softwareentwicklungszyklus dar.

    Spätestens in dieser Phase wird es notwendig, das erstellte Modell in ein Zielsystem umzusetzen.

    Dabei übernimmt der Code-Generator, die Umsetzung der Modellnotation in die Zielsprachennotation, d.h. das erstellte Modell wird mit seinen Modellkomponenten in eine Zielsprache "konvertiert".

    In dieser Situation entsteht das Problem, daß sich keine zielsprachenspezifische Informationen im erstellten Modell befinden, da diese Informationen aufgrund der Unabhängigkeit vom Zielsystem nicht benötigt werden.

    Die Code-Generation-Properties beinhalten nun diese sprachspezifische Informationen, die für die Code-Generierung in die Zielsprache notwendig sind.

    Die Code-Generation-Properties stellen also eine Verbindung zwischen der Modellnotation und der Zielsprache dar, denn mit Hilfe dieser Eigenschaften kann eingestellt werden, wie der Source-Code der Modellkomponenten in die Zielsprachennotation umgesetzt wird.

    Es existieren Eigenschaften,

    • die für das gesamte Modell
    • die für einzelne Modellkomponenten
    gelten.

    Im Abschnitt der Optionen und Einstellungen wurde bereits darauf hingewiesen, daß sich sogenannte Property-Sets abspeichern und laden lassen.

    Diese Eigenschaften stellen zunächst die Voreinstellungen für eine Modellkomponente bei Ihrer Erstellung dar.

    Im Spezifikationsfenster der Modellkomponenten können dann individuell die cg-Eigenschaften eingestellt werden, falls diese von den Voreinstellungen abweichen.

    1. Modell-Eigenschaften
      • Project
    2. Modellkomponenten-Eigenschaften
      • Class (inkl. standard operations)
      • Attribute
      • User-defined Operations
      • Has-Relationship
      • Use-Relationship
      • Role-Association
      • Category (logical packages)
      • Module-Spec (Module Specification)
      • Module-Body
      • Subsystems (component packages)

    • Was kann in den Eigenschaften eingestellt werden ?

      Im folgenden wird ein kleiner Ausschnitt über die Einstellmöglichkeiten der cg-Properties gegeben :

      • Project
        • Einstellung des Verzeichnisses, in das der Source-Code des Subsystemes generiert werden soll. Default-Wert ist AUTO GENERATE, d.h. es wird ein Verzeichnis im aktuellen Arbeitsverzeichnis angelegt
        • Dateiendung für Header- und Code-Dateien, sowie Dateiendungen für temporäre und Backup-Dateien
        • Verhalten während des Code-Generierungsprozesses
        • Angaben zur Behandlung von Assoziationen während Code-Generierung
        • Auswahl, ob Code-Bereiche generiert werden sollen
      • Module-Spec (Header-Files)
        • Angabe, ob Header-Datei erzeugt werden soll
        • Dateiname
        • Angaben über zusätzlich benötigte Include-Dateien
      • Module-Body (Implementation File)
        • Angabe, ob Implementation-Datei erzeugt werden soll
        • Dateiname
        • Angabe über zusätzlich benötigte Include-Dateien
      • Class
        • Auswahl über die Erzeugung von Signaturen von Konstruktoren und Destruktoren und die Art der Generierung (z.B. inline) und Zugriffsrechte auf diese Methoden
        • Auswahl über die Erzeugung von Signaturen für die Redefintion von Operatoren, wie z.B. Zuweisung, Relationen, Dereferentierung usw. und Zugriffsrechte auf diese Methoden
        • Angaben zum Verhalten bei IDL-Code-Generierung
      • Attribute
        • Auswahl für die automatische Erzeugung von get- und set-Methoden auf die Attribute
        • Zugriffsrechte auf get- und set-Methoden
        • Art der Implementierung der get- und set-Methoden
      • Operations (user-defined)
        • Art und Weise, wie die benutzerdefinierte Methode implementiert wird, d.h. Auswahl ob abstract, static, virtual usw.
        • Angabe, ob Methode Klassenattibute ändern darf (Const Member Functions)
      • Subsystems
        • Einstellung des Verzeichnisses, in das der Source-Code des Subsystemes generiert werden soll. Default-Wert ist AUTO GENERATE, d.h. es wird ein Verzeichnis im aktuellen Arbeitsverzeichnis angelegt.
      • Category
        • Angaben zur IDL-Code-Generierung


  2. C++-Code Generierung

    • Start der Code-Generierung

      Die Code-Generierung wird über das Menü Tools-C++-Code Generation gestartet.

      Vorher muß jedoch mindestens eine Modellkomponente ausgewählt werden, für die Source-Code generiert werden soll.

      Diese Modellkomponente muß eine Klasse, ein Paket oder ein Modul sein.

      Es erscheint ein Dialog-Fenster, in dem man den Fortschritt des Generierungsprozesses verfolgen kann. Außerdem wird angezeigt, wieviele Warnungen und Fehler sich in dem Modell befinden. Genaure Informationen zu den Warnungen und Fehlern erhält man in den Log-Fenster, in dem der Generierungsprozeß protokolliert wird.

    • Was passiert bei der Code-Generierung ?

      Für die ausgewählte Komponente wird entsprechend der Modell-Eigenschaften, der Code-Generation-Eigenschaften und der Spezifikation Source-Code generiert.

      Der C++-Code Generator erzeugt keine komplette Implementierung der Modellkomponente, sondern generiert lediglich das Gerüst für die Implementierung der ausgewählten Komponente.

      Die erzeugten Source-Code-Dateien müssen also mit der Implementierung der einzelnen Methoden ergänzt werden.

      Ausnahmen bilden hier die set- und get-Methoden für die Klassenattribute. Hierfür wird die Basis-Implementierung vorgenommen, falls dieses in den cg-Eigenschaften eingestellt wurde.

      Modellinformationen, die nicht in C++-Code umgesetzt werden können, z.B. Dokumentationen zur Komponente, werden als strukturierter Kommentar in den Source-Code übernommen.

      • Code-Generierung ohne physisches Modell

        Das Modell wurde im „component view" nicht in Subsysteme unterteilt.

        In diesem Fall nimmt der C++-Code-Generator implizit an, daß das physische Modell dem logische Modell entspricht.

      • Code-Generierung mit physikalischem Modell

        Das Modell wurde im „component view" in Subsysteme unterteilt und die logischen Pakete wurde den Subsystemen zugeordnet.

    • Ansicht der generierten Dateien

Über das Menü Browse-Browse Header bzw. Browse-Browse Body können die erzeugten Source-Code-Dateien angezeigt werden.

Als Besonderheiten der erzeugten Dateien sind die Code-Bereiche hervorzuheben.

Sie sind als Kommentar

//## begin ... preserve=yes|no

//## end ....

gekennzeichnet.

Diese Code-Bereiche werden vor der Neugenerierung des Codes berücksichtigt. Ist ein Code-Bereich mit preserve=yes gekennzeichnet, so wird dieser bei der Neugenerierung nicht überschrieben.

Die Implementierungen sollten zwischen diesen gekennzeichneten Code-Bereichen vorgenommen werden.

Außerdem sollten keine Code-Bereiche manuell beim Editieren des Source-Codes gelöscht werden, sondern es reicht aus, wenn aus einem geschützten ein ungeschützer Code-Bereich durch Änderung des preserve-Statements durchgeführt wird.

Bei der Neugenerierung wird dieser Bereich dann gelöscht.


  • DDL Code Generierung

    Der Generierungsprozeß wird über das Menü Tools - Generate DDL gestartet.

    Über das Menü Browse-Browse DDL Skript kann die erzeugte DDL Skript-Datei angezeigt werden.

    Rational Rose unterstützt die Generierung von SQL DDL Source Code für relationale Datenbanken der Hersteller

    sowie ANSI Standard SQL DDL.

    Die DDL Source Code Generierung kann mit den Einstellungen in den Projekteigenschaften (project properties) weiter angepaßt werden hinsichtlich

    Das Ergebnis des Generierungsprozesses kann dann in die Datenbank importiert werden.

    Am einfachsten wäre es, die persistenten Objekte in einem objektorientierten Datenbanksystem zu speichern, denn so ließen sich die persistenten Objekte 1:1 in ein objektorientiertes Datenbankschema transformieren. Die Entwicklung der objektorientierten Datenbanken befindet sich aber noch im Anfangsstadium.

    (Laut neueren Nachrichten existiert bereits Rational Rose/Oracle 8, die wohl die Datenbankanbindung nicht mehr mit RDBMS, sondern mit OODBMS realisiert.)

    Aus diesem Grunde versucht man weiterhin relationale Datenbanksysteme für die Speicherung der Daten für persistente Objekte zu nutzen.

    Im Allgemeinen existieren 3 Strategien, das Objektmodell in ein Datenbankschema zu transformieren :

    1. Alle Objekte werden in einer Tabelle gespeichert
      Die Datensatzlänge variert je nach Länge des zu speichernden Objektes. Bei großen Datenmengen oder vielen Assoziationen kann dieses zu Performanceeinbußen führen.
    2. Für jede Klasse (auch abstrakte) wird eine eigene Tabelle eingerichtet.
      Alle Datensätze haben den gleichen Speicherbedarf. Nachteil dieser Lösung ist, daß die Daten bei dem Laden eines Objektes aus mehreren Tabellen zusammengesucht werden müssen.
    3. Für jede konkrete Klasse wird eine eigene Tabelle eingerichtet.
      Jedes Objekt wird in einem einzigen Datensatz gespeichert. Beim Laden eines Objektes muß deshalb nur ein Datensatz gelesen werden.
      Der Nachteil dieser Lösung ist, daß beim Laden einer Menge zu einer gemeinsamen Unterklasse oder abstrakten Klasse Teilmengen verschiedener Tabellen zusammenzufügen sind. Dieses Problem kann mit der Definition von Datenbank-Views gelöst werden.

    Folie zur Datenbankanbindung

    Die 3. Strategie wird in der Praxis häufig implementiert, da diese einen akzeptablen Kompromiß zwischen Implementierungsaufwand und Leistungsfähigkeit darstellt.

    Im CASE-Tool Rational Rose hat man sich für die 2. Strategie zur Datenbankanbindung an ein RDBMS entschieden.


  • IDL Code Generierung

    IDL = Interface Definition Language

    Der Generierungsprozeß wird über das Menü Tools - Generate IDL gestartet.

    Über das Menü Browse-Browse Header kann die erzeugte IDL Skript-Datei angezeigt werden.

    Mit Hilfe des Rose IDL-Code Generator läßt sich IDL Source Code von Modellkomponenten für die Unterstützung von Broker-Systemen, wie z.B. CORBA, erzeugen.

    Bei der Generierung werden Informationen, die nicht in IDL dargestellt werden können, als strukturierter Kommentar hinzugefügt.


    [Seminarübersicht]...[Seitenanfang]
    Autor: Sven Garske
    Last Updated on Friday, 19 December, 1997