[UML] Generischer Rückgabetyp abhängig von Paramter

M.E.

Lt. Commander
Registriert
Jan. 2007
Beiträge
1.923
Hallo,

Ich habe einige Schwierigkeiten den richtigen Rückgabetyp einer Methode in der UML anzugeben.
Ich möchte folgendes in einem UML Diagramm darstellen:

Eine Übersetzerklasse soll folgende Methode anbieten.
Code:
+ translateValue(type : project::DataType, value : T) : Rueckgabe

Die Methode soll folgendes Verhalten zeigen:
Sie erhält mit dem Parameter type vom Typ project::DataType die Information zu welchem Typ konvertiert werden soll. Außerdem erhält die Methode einen value eines generischen Typs. Dieser Wert soll konvertiert werden und zurückgegeben werden.

Zur Verdeutlichung einige Beispielaufrufe (Pseudocode)
Code:
project::INTEGER x = translateValue(project::INTEGER, false); //in x steht jetzt der Wert 0 

project::BOOL y = translateValue(project::BOOL, 1); //in y steht jetzt der Wert true

Frage: Welchen Rückgabetyp muss ich im UML Diagramm angeben?
folgendes ist meiner Meinung nach falsch:
Code:
+ translateValue(type : project::DataType, value : T) : project::DataType
Denn project::DataType ist ja die Angabe eines Typs, die Methode soll aber die Instanz eines Typs zurückgeben.
Deutlich wird dieser Widerspruch dadurch, dass man, wenn die Methode project::DataType zurückgäbe, man diese in sich selbst einsetzen könnte und das macht keinen Sinn.

Wer weiß einen Ausweg? Vielen Dank im Voraus!

Edit: project::DataType ist ein Enum in dem mögliche Datentypen aufgelistet sind.
 
Zuletzt bearbeitet:
M.E. schrieb:
Deutlich wird dieser Widerspruch dadurch, dass man, wenn die Methode project::DataType zurückgäbe, man diese in sich selbst einsetzen könnte und das macht keinen Sinn.

Das sehe ich nicht als Problem an. Ich kann auch eine Substring Methode in sich selbst einsetzen. Ob das sinnvoll ist entscheidet ja nicht die Signatur sondern die Semantik der Methode.
Ich glaube auch, dass es so richtig ist wie du es hast, also dass project::DataType zurückgegeben wird. Dein Problem, wenn ich es richtig verstehe, ist doch sicherlich, dass du anhand dieser Signatur einen BOOL reingibst, aber einen INTEGER rausbekommen kannst. Ich fürchte, dass sich das nicht vermeiden lässt. Ich würde an die Stelle einfach ein Kommentar machen, dafür sind die schließlich da. Das Ziel von UML ist ja nur, dass man versteht was passiert und ich denke das ist dann gegeben.
 
Zuletzt bearbeitet: (smilies entfernt)
Freezedevil schrieb:
Ich glaube auch, dass es so richtig ist wie du es hast, also dass project::DataType zurückgegeben wird.
Das glaub ich nicht. project::DataType ist ja ein enum - er will aber eben einen konvertierten Wert/ein Objekt zurück bekommen.

@M.E.
Imho wäre es besser, wenn du auf den enum komplett verzichtest:
Code:
+ translateValue(value : T) : TResult

Wenns ohne den enum nicht geht, dann eben:
Code:
+ translateValue(type : project::DataType, value : T) : TResult

Dein Problem ist, dass bei deiner momentanen Methodensignatur (mit enum), die Methode zurückgeben kann was sie will.
Sie ist durch die Signatur nicht dazu gezwungen wirklich eine Instanz zurückzugeben die dem übergebenen project::DataType entspricht.
 
Hallo,

Ich denke das ist die Lösung:
Code:
+ translateValue(type : project::DataType, value : T) : TResult

Grantig schrieb:
Dein Problem ist, dass bei deiner momentanen Methodensignatur (mit enum), die Methode zurückgeben kann was sie will.
Sie ist durch die Signatur nicht dazu gezwungen wirklich eine Instanz zurückzugeben die dem übergebenen project::DataType entspricht.
Das Problem bleibt leider bestehen, aber ich werde es ausführlich kommentieren damit es eindeutig ist.

Ich denke die UML ist an dieser stelle einfach nicht mächtig genug diese Bedingung auszudrücken.
Es wäre gut, wenn jemand noch weitere Quellen zu dem Problem hat, weil ich sicher nicht der erste bin, der vor diesem Problem steht. Ich habe natürlich schon danach gegoogelt aber noch nichts dazu gefunden.

Danke für die Hilfe soweit!

MfG
M.E.
 
@Freezedevil
Meinem Verständnis nach ist das was auf stackoverflow diskutiert wurde ein anderes Problem. Das was dort zurückgegeben werden soll ist eine Instanz des Enums, also z.B. GREEN.

In meinem Fall wäre eine Instanz des Enums ein bestimmter Datentyp, also zum Beispiel project::BOOL . Das soll meine Methode aber nicht zurückgeben, sondern einen Wert (z.B. true) vom Typ project::BOOL .
 
Zurück
Oben