About SW-Quality Safety SW-Entwicklung UML Nachschlagen Programme
UML Basics
UML Diagramme
UML Tools
UML Interna
Beispiel_Rose Beispiel Together SourceCode Generierung
 
automatische SourceCode Generierung  einer einfachen Association
Die unscharfe Definition von UML zeigt sich vor Allem bei der automatischen Sourcecode- Generierung aus vorhandenen UML Diagrammen. Das triviale nebenstehende UML Klassendiagramm wird von den UML Tools in verschiedenen  Sourcecode umgesetzt.

 

public class A {
}
public class B {
    /**
     * @clientCardinality *
     * @supplierCardinality 0..* 
     */
    private A lnkA;
}
Von Together V6 erzeugt:
  •  Beim modellieren der Assoziation wurde bei B begonnen, deshalb hat Together für die Klasse A gar keinen Sourcecode generiert. Die Assoziation ist von A aus nicht zu erkennen. 
  • Bei Klasse B hingegen wurden Kommentarzeilen eingefügt. 
  • Eigenartig ist die Definition "private A linkA;", denn diese ermöglicht nur die Speicherung genau eines Objekts A, im UML Modell wurden jedoch 0..* modelliert. 
  • Zudem ist die Assoziation vom Namen des Attributes abhängig. Beginnt dieser mitl lnk (z.B. lnkA) so wird obiges Bild erzeugt, beginnt dieser nicht mit lnk (z.B. attr), so wird linkes Bild erzeugt, insbesondere wird das Attribut im Klassenmodell angezeigt. 
public class A 
{
   public B theB[];
   public A()    {   }
}
public class B 
{
   public B()    {   }
}

Nach dem Reverse Engineerung (Einlesen des Source in Rose):

Von Rational Rose
Rose will keinen direkten Bezug zum Sourcecode haben. Deshalb wird bei der Erstellung der UML Diagramme nicht automatisch Code generiert. Es stehen Codegeneratoren zur Verfügung um Code-Grundgerüste zu erzeugen und um vorhandenen  Code einzulesen (Reverse Engineering)
  • Rose generiert für gerichtete Assoziationen ein Klassenattribut. 
  • Die Multiplizität n (*) wir als Array übersetzt (was auch nicht richtig ist, da Array eine feste Größe hat, n jedoch unbestimmt ist). 
  • Ist die Assoziation ungerichtet, so wird kein Klassenattribut erzeugt. 
  • Hinweis: Im Gegensatz zu den anderen Tools auf dieser Seite wird die Sourcecodegenerierung bei Rose manuell angestoßen. Ein Live-Editieren des Sourcecodes ist nicht vorgesehen (Rose versteht sich nicht als IDE für die Programmerstellung, sondern als reines UML Tool)
  • Wird Sourcecode in Rose eingelesen, so werden die Attributnamen als Rollenbezeichner verwendet.
  • Hier ist UML eventuell unübersichtlich, da die weiter entfernte Rollenangabe ein Attribut der Klasse ist (z.B. attrb ist ein private Attribut von A und lnkC ein private Attribut von B).
public class A {
    Vector myB;
}
public class B {
    @element-type A0..* 
    */
    Vector myA;
}
Von Argo UML 0.10.1
Ganz anders wurde der Code von ArgoUML generiert:
  • Die Klasse A hat auch eine Klasse B.
  • Die Klassen werden in Vector-Objekten gespeichert, damit wird die 0..*  umgesetzt. 
  • Die (wohl falsche) @element Angabe produziert nicht kompilierbaren Code. 
public class A {
    public Vector B = new Vector();
}
public class B {
    public Vector A = new Vector();
}
Von Poseidon V1.3
  • Ähnlich wie ArgoUML wird ein Vektor generiert und immerhin gleich erzeugt (zudem ist der Code kompilierbar).
  • Bitte beachten: der Vektor hat zwar den Namen A (bzw. B), jedoch keinerlei Bezug zu der Klasse. Im Vektor kann alles gespeichert werden, es ist also Aufgabe der Programmlogik die UML Logik zu implementieren (es erfolgt nicht automatisch!). 
Fazit: 
Man muss nicht verwundert sein, dass UML noch nicht überall konsequent eingesetzt wurd. Es liegt an der mangelhaften und unterschiedlichen Toolunterstützung. Wenn erst das UML Modell modelliert wird, es aber nur in ein grobes Programmgerüst umgewandelt wird, muss die Implementierung nochmals das UML Modell nachbauen. Die Arbeit wird doppelt verrichtet und bewirkt doppelte Fehlerquellen! 
Hierfür sind Abhilfen zu schaffen. Vor Allem sind Einschränkungen und Modellierungsvorgaben für UML Modelle aufzustellen und zu beachten (QS-Regelungen, analog zu CodingRules für JAVA oder C++).
©; created Mon Aug 07 22:31:53 CEST 2006; eMail