Von UML zu C++ (Analysemuster "Wechselnde Rollen")



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Aber wie wird diese Modell dann in C++ umgesetzt, das ist meine Frage.

    Gar nicht (direkt).
    Das ist ein Analysemuster, kein Designmuster.
    Und wie gesagt: es riecht sehr nach Datenbank.



  • Danke für die Antwort zum Casten!

    Zu dem Problem an sich. Ich habe mir ein Buch gekauft: "Objektorientierter Softwareentwurf mit UML) - Grundlagen". Das Beispiel ist im Buch genauso geschildert wie ich es hier übertragen habe, und mit den selben Klassenbeispielen.

    Ich bin sehr neu in UML Übertagung zu Code.

    Deshalb können meine Fragen sehr Basic erscheinen.

    Dennoch, wenn ich dem Buch folge, sind Analysemuster insgesamt sehr, sehr kurze Codes. So zumindest die geschilderten Beispiele in C#. Wie ich es verstehe sind Analysemuster wie Skelette auf denen dann weiter gearbeitet wird und die immer wieder verwendet werden können. Ob, zum Beispiel, später die erhaltenen Daten in einer Datenbank gespeichert werden, käme, wie ich den Buch verstehe, hier erstmal nicht in Frage.

    Ich habe auch mehrere Beispiele von Übertragung von Analysemustern zu C++ Code auf verschiedenen Webseiten gefunden, und es sind immer sehr kurze Codebeispiele, von nicht mehr als 50 Zeilen und viele weit weniger.

    Ich denke also, dass dies hier in diesem Analysemuster nicht anders sein sollte.

    Diese Link finde ich gut hierzu:
    https://www.informatik-aktuell.de/entwicklung/methoden/von-der-uml-nach-c-vererbung-und-interfaces.html
    https://www.pearson.ch/download/media/9783827316516_SP.pdf



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Ich denke also, dass dies hier in diesem Analysemuster nicht anders sein sollte.

    Dann zitiere ich eben Deine eigene Quelle:

    Analyse und Design: In der Analysephase wird zunächst geklärt, was zu tun ist. Erst in der Designphase wird festgelegt, wie dies zu tun ist.



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Ich habe auch mehrere Beispiele von Übertragung von Analysemustern zu C++ Code auf verschiedenen Webseiten gefunden, und es sind immer sehr kurze Codebeispiele, von nicht mehr als 50 Zeilen und viele weit weniger.

    Zeig mal ein Beispiel.
    In deinen Links sehe ich kein einziges Analysemuster.

    Davon abgesehen:
    Du kannst das Muster "Wechselnde Rollen" in ein Klassendiagramm übertragen, und dieses Klassendiagramm kannst du dann natürlich in C++ abbilden.

    Was deine Lösung angeht: jetzt mal nur auf die Datenstruktur bezogen hast du hier eine N:1 Beziehung Besucher 1----* Besucherrolle modelliert. Soweit entspricht das noch dem Muster. Weiters hast du von Besucherrolle abgeleitete Klassen - auch das entspricht noch dem Muster.

    Allerdings hast du das Muster mMn. in der Analysemuster -> Klassendiagramm Phase falsch angewendet. bool eintrittserlaubnis; als Eigenschaft von Besucher macht keinen Sinn. Denn diese Eigenschaft ist abhängig von der Veranstaltung und der Rolle.
    Bei Veranstaltungen wo der Besucher als Künstler agiert hat er vermutlich implizit eine
    Eintrittserlaubnis. Und bei Veranstaltungen wo er als Gast agiert ist die Eintrittserlaubnis abhängig davon ob er sich z.B. ein Ticket gekauft hat. D.h. der Wert kann je nach Veranstatung unterschiedlich sein. Er kann daher kein Attribut des Besuchers sein.

    Was mMn. auch Quatsch ist ist std::string besucherRolle; als Attribut von Besucherrolle. Den Typ nochmal als String abzulegen macht keinen Sinn.

    Was dagegen in Besucherrolle fehlt ist die Information für welche Veranstaltung diese Rolle gilt.

    In diesem Beispiel wäre also noch eine 3. Klasse nötig: Veranstaltung (Besucherrolle *----1 Veranstaltung).



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Dennoch, wenn ich dem Buch folge, sind Analysemuster insgesamt sehr, sehr kurze Codes.

    Analysemuster sind keine "Codes".



  • Ich meine die Umsetzung eines Analysemuster zu Code.



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Ich meine die Umsetzung eines Analysemuster zu Code.

    OK.

    Dabei sind jetzt zwei Dinge wichtig:

    1. Diese Umsetzung erfolgt nicht direkt sondern in mehreren Schritten: Erstmal baust du mit Hilfe der in der Analyhsphase ermittelten Muster ein Design. Und dann baust du aus dem Design halt Code. Wobei auch das wieder ein mehrstufiger Prozess ist, denn als erstes sollte man sich mal überlegen welche Werkzeuge (Sprachen, fertige Komponenten wie Libraries/Datenbanken etc.) man verwenden sollte.
    2. Der Prozess so einer Umsetzung ist nicht eindeutig.

    Beispiele für solche Umsetzungen sind sehr hilfreich dabei zu verstehen wie ein bestimmtes Muster gemeint ist. Aber nicht geeignet dafür sie zu lernen und dann 1:1 in Programme reinzutippen.



  • @Swordfish Es geht nicht um die Analysephase. Es geht um die OOA-Musterlösungen.

    In meinem Buch steht dazu:
    "Ein OOA-Muster (also objektorientierter Analysemuster) ist ein Ausschnitt aus vorhandenen OOA-Modellen, dessen Implementierung sich in der Praxis bereits bewährt hat und entsprechend als standardisierte Lösung angesehen werden kann.
    Sie haben die Möglichkeit, sowohl allgemeine Muster als auch Muster zu verwenden, die für spezielle Szenarien vorgesehen sind und deren Einsitzt nur dort sinnvoll erscheint.

    Ein Muster besteht aus einer Gruppe von Klassen, die festgelegte Verantwortlichkeiten und Interaktionen besitzen.

    Mit dem Einsatz von Mustern tritt der Erstellungsprozess bereits in die Phase des OOD (objekt-orientiertes-Design) über."

    Das ist genau was ich versuche zu tun.

    Ich will gerne wissen ob die Übertragung, der vorherigen Definition folgend, die ich von dem Muster "wechselnde Rollen" zu Code gemacht habe, passend wäre oder ob diese Übertragung anders wäre, also, ob das Muster anderes zu interpretieren ist.



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Ich will gerne wissen ob die Übertragung, der vorherigen Definition folgend, die ich von dem Muster "wechselnde Rollen" zu Code gemacht habe, passend wäre oder ob diese Übertragung anders wäre, also, ob das Muster anderes zu interpretieren ist.

    Da fehlt ein ganzer Schritt. Das Design!



  • @hustbaer Das klärt einige meiner Fragen.



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    ch will gerne wissen ob die Übertragung, der vorherigen Definition folgend, die ich von dem Muster "wechselnde Rollen" zu Code gemacht habe, passend wäre oder ob diese Übertragung anders wäre, also, ob das Muster anderes zu interpretieren ist.

    Dazu hab ich dir ja bereits einen etwas längeren Beitrag geschrieben.

    Und es gibt noch weitere Dinge die in deiner Umsetzung keinen Sinn machen.

    z.B. was soll die Funktion definiertBesucher darstellen? Und der Code in Besucher::Besucher(Besucherrolle& typBesucher) ist auch völlig sinnfrei. Was mich wieder dazu bringt dass Beispiele realistisch sein müssen.

    Entweder du lässt erstmal alle Vorgänge weg und beschränkst dich darauf die Daten zu modellieren. Dann wirst du in deinem C++ Code keine Funktionen haben.

    Oder du brauchst realistische Vorgänge die du modellieren willst.
    Und dass jeder Besucher initial mit einer von aussen definierten Besucherrolle startet, zusätzlich aber immer die Rolle Künstler einnimmt, ist nicht realistisch.



  • @Swordfish Das Design ist oben gezeichnet und beschrieben, wie fast wie es im Buch steht...



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    @Swordfish Das Design ist oben gezeichnet und beschrieben, wie fast wie es im Buch steht...

    "Fast wie" ist bei solchen Fragen fast immer schlecht 😉



  • @hustbaer Ja, die habe ich eben erst gelesen. Und fand es ausführlich und gut. Habe darauf geantwortet. Diese Antwort klärt Fragen. Aber es bleiben bei mir weiterhin Fragen offen:

    Diese Muster enthält keine weiteren Klassen, nach dem Design und Beschreibung die im Buch gegeben sind (oder hier im Link Seite 95: http://www.sws.bfh.ch/~amrhein/Balzert-Heide.pdf). Also dürfte ich hier keine Veranstaltung-Klasse ergänzen, sofern ich die Idee dieser Muster richtig verstanden haben.

    Zum anderen frage ich mich noch immer ob die Implementierung mit dem Vector der ein Pointer auf Basisklasse ist um, durch ihn, auf auf die Kindklassen zuzugreifen) für dieses Muster angebracht wäre oder nicht. Ich denke das dass meine Kernfrage ist.



  • @hustbaer Es ist wirklich im Buch so. Es steht nur eine dritte erbende Klasse Mitarbeiter im UML Diagramm die ich mir hier gespart habe, weil es auf das selbe hinausläuft.



  • @hustbaer sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    z.B. was soll die Funktion definiertBesucher darstellen? Und der Code in Besucher::Besucher(Besucherrolle& typBesucher) ist auch völlig sinnfrei. Was mich wieder dazu bringt dass Beispiele realistisch sein müssen.

    Ja, genau darauf bezieht sich im Kern meine Frage. Die Idee dahinter es folgende:

    Es scheint mir, dass die Kardinalität (*) am Besten mit Vektoren umzusetzen wäre, so dass von den Objekten die dieser Kardinalität zugeordnet wären, beliebig viele erstellt werden könnten. Wie ich dieses Muster interpretiere sollte in der Klasse Besucher die Möglichkeit bestehen beliebig viele "Besucherrollen" anzulegen. Im Beispiel sind es zwei: Gast und Künstler. Es könnten aber 5 oder 10 sein, oder eben beliebig viele.

    Im Konstruktor habe ich eben diese zwei Rollen in den Vektor gelegt, zur Veranschaulichung für mich, dass eben beliebig viele Rollen angelegt werden könnten.

    Genau hier bin ich mir nicht sicher ob ich das Problem irgendwie falsch vestehe.



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Diese Muster enthält keine weiteren Klassen, nach dem Design und Beschreibung die im Buch gegeben sind (oder hier im Link Seite 95: http://www.sws.bfh.ch/~amrhein/Balzert-Heide.pdf).

    In dem von dir verlinkten Beispiel ist es keine 3. Klasse sondern ein einfaches Attribut "Zeitraum". In deinem Beispiel ist das aber nicht ausreichend. Es kann ja mehrere Veranstaltungen zur selben Zeit geben. Natürlich kann ein Besucher schwer gleichzeitig auf mehreren Veranstaltungen sein. Trotzdem wäre dort die Unterscheidung anhand des Zeitraums nicht sinnvoll. Sondern eben die Unterscheidung anhand der Veranstaltung.

    Wichtig dabei ist: verstehst du worum es dabei geht? Denn dieses einschränkende Attribut ist ein wichtiges Thema bei dem Muster "Wechselnde Rollen".

    Zum anderen frage ich mich noch immer ob die Implementierung mit dem Vector der ein Pointer auf Basisklasse ist um, durch ihn, auf auf die Kindklassen zuzugreifen) für dieses Muster angebracht wäre oder nicht. Ich denke das dass meine Kernfrage ist.

    Es ist eine mögliche Umsetzung der 1:N Beziehung. Ob es die angebrachte Umsetzung ist lässt sich nur anhand des Musters nicht beantworten. Dazu muss man mehr Dinge darüber wissen was das Programm alles machen soll.

    Es ist wirklich im Buch so. Es steht nur eine dritte erbende Klasse Mitarbeiter im UML Diagramm die ich mir hier gespart habe, weil es auf das selbe hinausläuft.

    Und welche Attribute hat dort die Basisklasse Besucherrolle? Da muss irgendwas sein das dazu dient die "gültigkeit" dieser Rolle einzuschränken. Also entweder die Veranstaltung oder ein Datum/Zeitraum oder ...



  • @GMgenia sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Wie ich dieses Muster interpretiere sollte in der Klasse Besucher die Möglichkeit bestehen beliebig viele "Besucherrollen" anzulegen. Im Beispiel sind es zwei: Gast und Künstler. Es könnten aber 5 oder 10 sein, oder eben beliebig viele.

    Ja, es können beliebig viele sein. Soweit stimmt das schon.

    Du musst auf jeden Fall zwischen den Besucherrollen Klassen und den Objekten dieser Klassen unterscheiden.

    Also ...
    Ein Besucher kann beliebig viele Veranstaltungen besuchen. z.B. kann es sein dass er nur eine Veranstaltung besucht, und dort Gast ist. Dann hätte dieses Besucher Objekt genau ein Besucherrollen-Objekt vom Typ Gast. Und keines vom Typ Künstler.

    Ein anderer Besucher besucht 3 Veranstaltungen und ist auf allen dreien Gast. Dieses Besucher Objekt hätte dann drei Besucherrollen-Objekte vom Typ Gast. Und keines vom Typ Künstler.

    Und wieder ein anderer besucht eine Veranstaltung als Gast und zwei weitere als Künstler. Der hätte dann dementsprechend ein Besucherrollen-Objekt vom Typ Gast und zwei vom Typ Künstler.

    Usw.

    Damit sollte jetzt auch klar sein, dass in dem Besucherrollen-Objekt noch irgend ein Attribut sein muss das uns sagt um welche Veranstaltung es sich handelt. Denn sonst können wir die Besucherrollen-Objekt ja nicht zuordnen. Also wir können sie dem Besucher zuordnen. Aber wir wissen nicht wo er als Künstler auftritt, wo er Gast ist und rein darf weil das Besucherrollen-Objekt die Information "hat Ticket gekauft = true" hat und wo er Gast ist aber nicht rein darf weil das Besucherrollen-Objekt die Information "hat Ticket gekauft = false" hat.

    Genau hier bin ich mir nicht sicher ob ich das Problem irgendwie falsch vestehe.

    Irgendwas verstehst du irgendwo falsch. Da bin ich mir fast sicher 🙂 Kann dir aber leider nicht sagen wo und was.



  • @hustbaer sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Irgendwas verstehst du irgendwo falsch. Da bin ich mir fast sicher Kann dir aber leider nicht sagen wo und was.

    Jajjajajaja! 😄 😄

    Ok, ich versuche einfach mal weiter im Buch voranzukommen. Vielleicht klären sich die Fragen dann von allein... Ansonsten, hättest Du als Vorschlag ein gutes Buch das "UML zu C++" behandelt? Ich habe eins bestellt, das gut sein soll, zumindest nach den wenigen Kundenbewertungen die ich dazu finden konnte: "C++, UML und Design Patterns (Deutsch) Gebundene Ausgabe – 1. Juli 2005, von Helmut Herold". Vielleicht kennst Du ein anderes gutes Buch zum Thema?



  • @hustbaer sagte in Von UML zu C++ (Analysemuster "Wechselnde Rollen"):

    Es ist eine mögliche Umsetzung der 1:N Beziehung. Ob es die angebrachte Umsetzung ist lässt sich nur anhand des Musters nicht beantworten. Dazu muss man mehr Dinge darüber wissen was das Programm alles machen soll.

    Ok, verstehe!


Anmelden zum Antworten