![]() |
SELFHTML Forumsarchiv |
|
|
Die folgende Nachricht zum Thema stammt von: hkl, 29. 11. 2006, 16:23
Hallo !
Hab mir mittels ArgoUML ein minimales Testmodell erstellt; dessen XMI - Export steht am Schluss des Beitrags.
In C++ wuerde das wohl so aussehen#include <string>
/* abstract */ class Bar {
protected:
/* abstract */ virtual void doit() = 0;
};
class Baz : public Bar {
protected:
/*virtual*/ void doit(){};
public:
std::string really() {
return std::string("");
};
};
class Foo
{
public:
Bar* m_pBar; // Schon klar, das sollte private sein
};
Zur Erlaeuterung : "virtual void ... = 0;" entspricht "abstract" bei Java.
Also eine Klasse Foo, die eine Referenz ( hier eien Zeiger ) auf die abstrakte Klasse Bar eignet ( Aggregation ), eine Klasse Bar mit einer abstrakten Methode doit() und eine Klasse Baz, abgeleitet von Bar, die die Methode doit() implementiert und eine eigene oeffentliche Methode really() hat .
Jetzt moechte ich mir mittels UMMF Perl-Prototypen generieren lassen. ( Der ArgoUML-Generator unterstuetzt Perl-Generation nicht )
Zu UMMF :
Installiert als root via perl -MCPAN -e shell.
Das schlug erst mal fehl;
#ein Aufruf mit
ummf -e Perl ~/projects/cont2wiki/vhost/home/project/c2w_argo.zargo
# stieg aus wegen einer fehlenden "Perl.txt".
# Die gab's aber in meinem .cpan wd:
# ~/.cpan/build/UMMF-1.02/data/ummf/template/Perl.txt,
# also in ~/.cpan/build/UMMF-1.02/:
tar -cvf - data | tar -xf - -C /usr/local/share/perl/5.8.4/UMMF
# ( ich hasse rekursives Kopieren mit cp; nehme immer tar dafuer )
Ab da generiert ummf. Aber halt keine Methoden:
ummf -e Perl -o perltest ~/projects/cont2wiki/vhost/home/project/c2w_argo.zargo
#oder
ummf -e Perl -o perltest ~/projects/cont2wiki/vhost/home/project/c2w_argo.xmi
# mit dem aus Argo exportierten XMI
erzeugt mir wunderschoene Klassendekarationen, und Attributierungen und einen ganzen Bulk von Helper-Funktionen, aber weder die Funktionen doit() noch really tauchen irgendwo auf.
Erste Hypothese:
Works as designed, damit vorhandene Implementierungen nicht ueberschriben werden.
Von Hand eine Funktion eingefuegt, neu generiert. Funktion weg :-(
Zweite Hypothese:
UMMF benutzt ein Java-centric profil; viellicht liegt's dort. Das Profil bezieht sich aber auf den UML-Generator ( ArgoUML ist eine Java-Anwendung )
Dritte Hypothese :
UMMF kennt die Rueckgabetypen aus Perl nicht. Aber die aus Java wird er ja wohl kennen - also :
Gegentest
ummf -e Java -o javatest ~/projects/cont2wiki/vhost/home/project/c2w_argo.zargo
dto., es werden sogar pro Klasse Interfaces deklariert. Aber auch die sind wieder leer.
=> Hat jemand eine Idee ? Vielleicht eigene Erfahrungen mit UMMF ? <=
=> Oder kennt ein anderes Tool das Perl-Code aux XMIs generiert ? <=
Das kann doch nicht so gemeint sein - Codegenerierung die die Interfaces nicht umfasst ????
Das sind so die Softwareprobleme, die ich besonders nervig finde - wenn nicht mal den Fuss in die Tuer kriegt.
Etwa wie ein C-Compiler, der "Hello World" nicht packt...
Ein paar Versionsnummer zum Abschluss
Linux 2.6.8-3-686 ( Debian sarge 3.1r1 )
libxml2.so.2.6.16
ArgoUML v0.22 ( jre 1.5.0_09-b03 )
perl 5.8.4
UMMF 1.02
Sorry fuer die Laenge des Beitrags und danke fuer's Lesen
Gruss
Holger
<?xml version = '1.0' encoding = 'UTF-8' ?>
<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Wed Nov 29 15:23:16 CET 2006'>
<XMI.header> <XMI.documentation>
<XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>
<XMI.exporterVersion>0.20.x</XMI.exporterVersion>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header>
<XMI.content>
<UML:Model xmi.id = '-64--88-1-2-9dbbd02:10f22425394:-8000:000000000000077B'
name = 'cont2wiki' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
<UML:Namespace.ownedElement>
<UML:Class xmi.id = '-64--88-1-2-9dbbd02:10f22425394:-8000:000000000000077C'
name = 'Foo' visibility = 'public' isSpecification = 'false' isRoot = 'false'
isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
<UML:Class xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007DD'
name = 'Bar' visibility = 'public' isSpecification = 'false' isRoot = 'false'
isLeaf = 'false' isAbstract = 'true' isActive = 'false'>
<UML:Classifier.feature>
<UML:Operation xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F3'
name = 'doit' visibility = 'public' isSpecification = 'false' ownerScope = 'instance'
isQuery = 'false' concurrency = 'sequential' isRoot = 'false' isLeaf = 'false'
isAbstract = 'true'>
<UML:BehavioralFeature.parameter>
<UML:Parameter xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F4'
name = 'return' isSpecification = 'false' kind = 'return'>
<UML:Parameter.type>
<UML:DataType xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F2'/>
</UML:Parameter.type>
</UML:Parameter>
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Class xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007DF'
name = 'Baz' visibility = 'public' isSpecification = 'false' isRoot = 'false'
isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007E1'/>
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Operation xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F5'
name = 'doit' visibility = 'protected' isSpecification = 'false' ownerScope = 'instance'
isQuery = 'false' concurrency = 'sequential' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
<UML:BehavioralFeature.parameter>
<UML:Parameter xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F6'
name = 'return' isSpecification = 'false' kind = 'return'>
<UML:Parameter.type>
<UML:DataType xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F2'/>
</UML:Parameter.type>
</UML:Parameter>
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F7'
name = 'really' visibility = 'public' isSpecification = 'false' ownerScope = 'instance'
isQuery = 'false' concurrency = 'sequential' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
<UML:BehavioralFeature.parameter>
<UML:Parameter xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F8'
name = 'return' isSpecification = 'false' kind = 'return'>
<UML:Parameter.type>
<UML:Class xmi.idref = '-64--88-1-2-72715727:10f33f091a6:-8000:00000000000007F3'/>
</UML:Parameter.type>
</UML:Parameter>
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Generalization xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007E1'
isSpecification = 'false'>
<UML:Generalization.child>
<UML:Class xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007DF'/>
</UML:Generalization.child>
<UML:Generalization.parent>
<UML:Class xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007DD'/>
</UML:Generalization.parent>
</UML:Generalization>
<UML:Association xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007E9'
name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
<UML:Association.connection>
<UML:AssociationEnd xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007EA'
visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered'
aggregation = 'aggregate' targetScope = 'instance' changeability = 'changeable'>
<UML:AssociationEnd.multiplicity>
<UML:Multiplicity xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007EB'>
<UML:Multiplicity.range>
<UML:MultiplicityRange xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007EC'
lower = '1' upper = '1'/>
</UML:Multiplicity.range>
</UML:Multiplicity>
</UML:AssociationEnd.multiplicity>
<UML:AssociationEnd.participant>
<UML:Class xmi.idref = '-64--88-1-2-9dbbd02:10f22425394:-8000:000000000000077C'/>
</UML:AssociationEnd.participant>
</UML:AssociationEnd>
<UML:AssociationEnd xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007ED'
visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
<UML:AssociationEnd.multiplicity>
<UML:Multiplicity xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F1'>
<UML:Multiplicity.range>
<UML:MultiplicityRange xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F0'
lower = '1' upper = '-1'/>
</UML:Multiplicity.range>
</UML:Multiplicity>
</UML:AssociationEnd.multiplicity>
<UML:AssociationEnd.participant>
<UML:Class xmi.idref = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007DD'/>
</UML:AssociationEnd.participant>
</UML:AssociationEnd>
</UML:Association.connection>
</UML:Association>
<UML:DataType xmi.id = '-64--88-1-2-25d8ea0d:10f2d318756:-8000:00000000000007F2'
name = 'void' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'/>
<UML:DataType xmi.id = '-64--88-1-2-72715727:10f33f091a6:-8000:00000000000007F0'
name = 'int' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'/>
<UML:Package xmi.id = '-64--88-1-2-72715727:10f33f091a6:-8000:00000000000007F1'
name = 'java' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
<UML:Namespace.ownedElement>
<UML:Package xmi.id = '-64--88-1-2-72715727:10f33f091a6:-8000:00000000000007F2'
name = 'lang' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false'>
<UML:Namespace.ownedElement>
<UML:Class xmi.id = '-64--88-1-2-72715727:10f33f091a6:-8000:00000000000007F3'
name = 'String' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
isAbstract = 'false' isActive = 'false'/>
</UML:Namespace.ownedElement>
</UML:Package>
</UML:Namespace.ownedElement>
</UML:Package>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
</XMI>
--
Aus dem Perl Styleguide:
"Choose mnemonic identifiers. If you can't remember what mnemonic means, you've got a problem."
© 1998-2006
Impressum, Software: Classic Forum