# Modellierungsprobleme



## Kirby.exe (7. Sep 2021)

Also ich muss eine Hausarbeit schreiben und hänge von meinem Gedankengang einfach nur fest...Das Thema ist ein Quiz. Ich beschreibe mal erstmal den Soll-Zustand:

Es soll ein Quiz erstellt werden. Dieses soll verschiedene Quizarten (Multiplechoice, Ja oder Nein,...), Quizthemen und Schwierigkeitsstufen haben. Angesteuert wird das Quiz von einem Nutzer über eine Sprachschnittstelle (Im Moment textuell). Diese wird mittels Buzzwords/Triggerwords gesteuert (stoppe Quiz,...). Der Nutzer soll nach jeder Frage das Thema oder die Quizart ändern können. Ist zwar noch nicht teil der Phase aber es soll im MVC umsetzt werden.

Nun zu meinem Hänger....Ich verstehe nicht ganz wie ich das "gut" modellieren kann. Ich sehe nicht wirklich wie ich das mit der ein und ausgabe machen soll, also das an mein Quizmanagement zu knüpfen.

Folgendes Beispiel:

Der Nutzer hat aktuell eine Frage: Was sind 1m in cm? A: 100cm, B: 1000cm, C: 10cm, D: 600cm
Sprich ich starte in der Spracheingabe und der Nutzer sagt: "Gebe mir eine Frage mit dem Thema Mathe", dann würde man ja über den TriggerHandler gehen und irgendwie die Information extrahieren, dass man Fragen mit dem Thema Mathe möchte. Jedoch was mache ich nun? Wie vermittele ich diese Information an mein QuizManagement? Ich bin völlig verwirrt....

Es ist schwierig den ganzen Mist zu Screenshotten...Es wird in Papyrus modelliert, der Download Link dazu ist hier

Edit: Ich hatte das Projekt vergessen hochzuladen...Habe es mit angehangen


----------



## mihe7 (8. Sep 2021)

Habe mir das jetzt nicht näher angesehen, Du sollst ruhig kurz vor der Verzweiflung stehen  Modellierung ist nicht trivial, Du wirst Deine ersten Modelle verwerfen usw.

Daher mal ganz allgemein: der Controller übersetzt Eingaben des Benutzers in Methodenaufrufe an das Model. Das Model ist für die Verarbeitung zuständig und informiert die View über Änderungen. Die View stellt Informationen des Models dar. Das wäre das klassische MVC. Mach was draus.


----------



## Mart (8. Sep 2021)

mihe7 hat gesagt.:


> Modellierung ist nicht trivial,


das kann ich nicht behaupten... mein modellierungs lehrer hat immer gesagt "das ist trivialerweise sehr trivial"


----------



## mihe7 (8. Sep 2021)

Mart hat gesagt.:


> mein modellierungs lehrer hat immer gesagt "das ist trivialerweise sehr trivial"


... und dann ging ihm das Plastilin aus


----------



## Kirby.exe (8. Sep 2021)

Ich muss ehrlich sagen…ich hasse dieses Modul xD


----------



## mihe7 (8. Sep 2021)

Naja, in solchen Modulen wird natürlich auch immer Zeug behandelt, wo man sich fragt: muss das jetzt wirklich sein? 

OOA/OOD gefällt mir. Damit meine ich nicht UML-Diagramme malen (schon gar nicht im Detail), sondern das Suchen nach (versteckten) Anforderungen, geeigneten Abstraktionen, welche Typen man braucht, was zusammenarbeitet, wie die Prozesse aussehen usw. 

Ja, eine Rechnung besteht aus Rechnungspositionen - das ist nun "trivialerweise sehr trivial". Aber man stößt immer wieder auf Probleme und deren Lösung macht den Reiz aus. 

In meinen Anfängen hätte ich einfach eine Assoziation zwischen Rechnung und Kunde eingeführt, nach dem Motto: klar, jede Rechnungen bezieht sich auf einen Kunden und ein Kunde besitzt n Rechnungen, also muss da eine 1:n-Assoziation rein, fertig.

Das ist für die Analyse noch ok, im Design ist es aber meist nicht ganz so einfach. Das Ändern von Kunden- und Rechnungsdaten erfolgt gewöhnlich in verschiedenen Transaktionen. Wenn der Kunde umzieht, inaktiv oder anonymisiert wird, dann hat das mit den Rechnungen nichts zu tun. Vielmehr besteht in der Regel die z. T. implizite Anforderung, dass sich einmal geschriebene Rechnungen inhaltlich nicht mehr ändern dürfen. Bezieht sich die Rechnung nur auf den Kunden via Assoziation, steht auf einer gedruckten Rechnung vor einer Adressänderung automatisch die alte Anschrift und danach die neue. 

Also dupliziert man Anschrift und Nummer (bzw. eine geeignete ID) des Kunden für die Verwendung in der Rechnung. Über die Kundennummer kann der Bezug zu "Bestandskunden" hergestellt werden. Wenn es diese nicht (mehr) gibt, ist die Rechnung trotzdem unverändert brauchbar.

Das mal als kleines, noch relativ einfaches Beispiel.


----------



## Kirby.exe (8. Sep 2021)

Also ich habe aber immernoch irgendwie noch kein Bild vor Augen, wie die Kommunikation ist also wie ich das Modul der Ein und Ausgabe verwenden kann  Ich habe das erstmal mit Static Variablen gelöst, aber ich sehe noch nicht ganz was bei mir die "Driverklasse" sein soll und wie ich mir den Code ca vorstellen kann...Aber vielleicht verrenne ich mich auch einfach


----------



## LimDul (8. Sep 2021)

Du machst den zweiten Schritt vor dem ersten gefühlt.

Hast du überhaupt ein Modell fertig? Bevor du über Kommunikation reden kannst?

Sprich was für "Konzepte" hast du, was haben die für Eigenschaften? Danach kann man darüber reden, wie die miteinander reden - aber das wäre der erste Schritt.

Das sind so Dinge:
* Fragen
* Zustand des Spiels
* Spracherkennung

Sprich, ist dir schon klar, was die für Zustände & Informationen haben?


----------



## Kirby.exe (8. Sep 2021)

Also die Fragen habe ich modlliert. Jede Frage hat einen Fragetext, eine Punktzahl, eine Schwierigkeit (leicht, mittel, schwer), einen Fragetyp (Ja oder Nein, Multiplechoice), und zwei Listen mit richtigen und falschen Antworten. 

Zustand des Spiels habe ich mir überlegt, aber ich sehe noch nicht ganz wie man das machen könnte...Der initiale Zustand ist, dass der Party-Leader(Spieler mit Index 0) kann Fragen nach Fragetyp oder Thema auswählen. Danach wird die erste Frage aus diesem Stapel von Frage genommen und den Spielern vorgelegt. Nun muss jeder Spieler der Runde die Frage beantworten und am Ende wird die korrekte Antwort ausgegeben. Wenn die Frage von allen beantwortet wurde, kann der Party-Leader das Spiel abbrechen mit dem Kommando "Stoppe das Spiel". Wenn das Spiel gestopppt wurde, kann man optional noch eine Statistik anzeigen lassen. Es wird jedoch immer das Spieler Ranking ausgegeben.

Bei der Spracherkennung bin ich mir noch sehr unklar, da diese ja Informationen an den TriggerwortHandler geben muss um die richtige Funktion aufzurufen, aber so wirklich verstehen wie man das machen könnte weiß ich nicht.


----------



## LimDul (8. Sep 2021)

Kirby.exe hat gesagt.:


> Zustand des Spiels habe ich mir überlegt, aber ich sehe noch nicht ganz wie man das machen könnte...Der initiale Zustand ist, dass der Party-Leader(Spieler mit Index 0) kann Fragen nach Fragetyp oder Thema auswählen. Danach wird die erste Frage aus diesem Stapel von Frage genommen und den Spielern vorgelegt. Nun muss jeder Spieler der Runde die Frage beantworten und am Ende wird die korrekte Antwort ausgegeben. Wenn die Frage von allen beantwortet wurde, kann der Party-Leader das Spiel abbrechen mit dem Kommando "Stoppe das Spiel". Wenn das Spiel gestopppt wurde, kann man optional noch eine Statistik anzeigen lassen. Es wird jedoch immer das Spieler Ranking ausgegeben.


Das ist nicht der Zustand, das der Ablauf. Ein relevanter Unterschied. Für den Zustand des Spiels ist das Kommando "Stoppe das Spiel" vollkommen irrelevant und spielt keine Rolle.

Welche Informationen hält der Zustand des Spiels vor? Das werden so Dinge wie ein Status: "NICHT_LAUFEND, LAUFEND , ..." Das werden so informationen sein "Spieler am Zug" etc.

Modelliere z.B. den Zustand des Spiels mal als State-Machine und überlege dir, welche Informationen du eigentlich in jedem Status brauchst um da sinnvoll den Übergang hinzubekommen.  Der Zustand *darf* bei sauber Modellierung absolut nichts mit der Spracheingabe zu tun haben. Ob das Spiel gestartet wird, weil es einen Sprachbefehl gab oder jemand im UI auf einen Knopf gedrückt oder über Netzwerk ein Client das Spiel gestartet hat ist dafür vollkommen egal.


Wenn du das alles hast, wird einiges einfacher. Du hast einen Zustand, der von außen z.B. über eine Methode von laufend in beendet überführt werden kann. Du hast eine Klasse, die in der Lage ist Spracheingaben in sinnvolle Informationen zu übersetzen. Und dann hast du einen Controller, der die Verknüpfung herstellt, der also die Info bekommt "Spracheingabe Stoppe das Spiel" und der dann z.B. prüft ob der Benutzer, von dem die Eingabe kommt das Recht hat und ob der Zustand des Spiels überhaupt passend ist und dann diesen Befehl verarbeitet.


----------



## Barista (8. Sep 2021)

Meine Idee:

Wenn das Spiel ein azyklischer Graph ist, könntest Du das Spiel in XML oder besser JSON aufschreiben.

Der Spielzustand ist dann ein Pfad durch den Spielbaum.


----------



## mrBrown (9. Sep 2021)

Barista hat gesagt.:


> Wenn das Spiel ein azyklischer Graph ist, könntest Du das Spiel in XML oder besser JSON aufschreiben.
> 
> Der Spielzustand ist dann ein Pfad durch den Spielbaum.


Oder halt einfach als Graph aufmalen (State Machine wurd ja schon genannt), statt irgendein völlig beliebig gewähltes Serialisierungsforma dafür zu missbrauchen??


----------



## LimDul (9. Sep 2021)

Das wichtigste ist meines Erachtens sich im ersten Schritt auf eine passende Abstraktionsebene zu begeben. Ich halte es für falsch direkt mit Technik (sei es XML/JSON, sei es static, etc.) anzufangen, wenn man das fachlich/technische Konzept noch nicht verstanden hat. Solange mir nicht klar ist "*Was* ist der Zustand des Spiels" ist meines Erachtens jede Diskussion über Technologie überflüssig oder schädlich.

Mit steigender Erfahrung gehen diese Abstraktions- und Modellierungs-Schritte immer schneller und man kann kommt schneller auf eine Detail-Ebene runter. Aber als Anfänger ist es meines Erachtens sinnvoll das wirklich in Ruhe zu machen.


----------

