Anfänger Frage zu MVC

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Anfänger Frage zu MVC

Beitrag von Well » 22.07.2013, 10:49:46

Hi,

angenommen, ich habe ein Spiel (keine Webanwendung), in dem es ein Spielfeld mit Spieler und Bomben gibt, wobei ein Spieler eine Bombe legen kann, die dann irgendwann explodiert.

Dazu habe ich, als Model, die Klassen Spielfeld, Spieler und Bombe, wobei zwischen Spielfeld und Spieler sowie Bombe jeweils eine 1-n Beziehung existiert.

a) Darf "Bombe" eine update()-Methode enthalten, die, wenn irgendeine Bedingung eintritt, den Zustand der Bombe zu "explodiert" verändert? Oder müsste ich dafür eine Art "BombenManager" erstellen, der für alle Bomben eines Spielfelds diese Aufgabe übernimmt?

b) Angenommen, ein Spieler möchte nun eine Bombe auf das Spielfeld legen. Dürfte die Klasse "Spieler" dazu eine Methode "legeBombe()" haben, die mittels einer Factory eine neue Bombe erzeugt und dem Spielfeld hinzufügt? Oder gehört das auch in eine Controller-Klasse?

c) Angenommen, das Spiel soll nun netzwerkfähig gemacht werden. Wohin gehört die Synchronisation der Attribute der Spielobjekte (Spieler, Bombe, beispielsweise "Leben", "Position", ...)? Darf sich ein Model mit den Clients / mit dem Server selbst synchronisieren oder ist das Aufgabe eines Controllers (der sich beispielsweise als Observer am Model registriert)?

Darf ein Model Abhängigkeiten zu einem Manager / Service haben? (bspw. bei c) einem Service für das Netzwerk)

Ich kann die Fragen selbst nicht eindeutig beantworten, da ich bislang Unterschiedliches zu MVC gehört habe. Soll ein Model nur Daten speichern und keinerlei Operationen ausführen, wenn diese (a) nur die Daten des Models selbst betreffen oder (b) auch die Daten anderer Models betreffen?
Darf ein Model durchaus auch Logik enthalten, wobei der Controller nur den Anwendungsfluss bestimmt?

(Ich hoffe, ich darf hier so vom APF unabhängige Fragen stellen.)

Mit freundlichen Grüßen

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Anfänger Frage zu MVC

Beitrag von dr.e. » 22.07.2013, 19:04:08

Hallo Werner,

natürlich darfst du auch APF-unabhängige Fragen stellen. :)

Ich versuche mal der Reihe nach zu beantworten:
a) Darf "Bombe" eine update()-Methode enthalten, die, wenn irgendeine Bedingung eintritt, den Zustand der Bombe zu "explodiert" verändert? Oder müsste ich dafür eine Art "BombenManager" erstellen, der für alle Bomben eines Spielfelds diese Aufgabe übernimmt?
Das ist weniger eine MVC-Frage, denn eine Frage wie du Daten modellierst. Hier gibt es das Transaction-Script-Pattern, in dem eher DTOs gehalten wird. Gemäß dieser Umsetzung wirst du einen "Manager" vorfinden, der die Logik kapselt. Implementierst du nach dem Domain-Object-Pattern hast du ein Objekt "Bombe", das alle Daten und Logik kapselt. Beide Vorgehensweisen sind valide.
b) Angenommen, ein Spieler möchte nun eine Bombe auf das Spielfeld legen. Dürfte die Klasse "Spieler" dazu eine Methode "legeBombe()" haben, die mittels einer Factory eine neue Bombe erzeugt und dem Spielfeld hinzufügt? Oder gehört das auch in eine Controller-Klasse?
Intuitiv würde ich nach dem Domain-Object-Pattern im Controller für einen Spieler eine "Bombe" erzeugen und auf ein Spielfeld legen (Playground::attachBomb()), wobei das Spielfeld wieder ein Domain-Objekt ist. Nach dem Transaction-Script-Pattern hast du dann vielleicht ein DTO Bombe, das beim "PlaygroundManager" eine Bombe anlegt - dort vielleicht sogar mit einer Methode mit dedizierten Übergabe-Parametern inkl. des Spielers.
c) Angenommen, das Spiel soll nun netzwerkfähig gemacht werden. Wohin gehört die Synchronisation der Attribute der Spielobjekte (Spieler, Bombe, beispielsweise "Leben", "Position", ...)? Darf sich ein Model mit den Clients / mit dem Server selbst synchronisieren oder ist das Aufgabe eines Controllers (der sich beispielsweise als Observer am Model registriert)?
Die Frage ist: "Was ist dein Client in diesem Zusammenhang?". Ich würde spontan sagen, dass die Synchronisation immer dann stattfindet, wenn eine Aktion getriggert wird (z.B. Bombe legen) und der Zustand auf dem Server gehalten wird. Änderungen - wenn wir konkret über eine JS-GUI sprechen, die mit AJAX-Calls mit dem "Backend", sprich der Applikation interagiert - werden dann per AJAX an die Applikation geliefert und dort kann ein Rückgabewert über die Änderung eines Lebens oder einer Position erfolgen.
Darf ein Model Abhängigkeiten zu einem Manager / Service haben? (bspw. bei c) einem Service für das Netzwerk)
Sofern du von einem Model auf einer weiteren/höheren Abstraktionsebene sprichst ja, innerhalb der selben Ebene solltest du dich entscheiden, mit welchem Pattern (siehe oben) du arbeitest.
Ich kann die Fragen selbst nicht eindeutig beantworten, da ich bislang Unterschiedliches zu MVC gehört habe.
IMHO haben die Fragen weniger mit MVC zu tun, denn mit der Wahl des - für das Projekt - richtige Pattern.
Soll ein Model nur Daten speichern und keinerlei Operationen ausführen, wenn diese (a) nur die Daten des Models selbst betreffen oder (b) auch die Daten anderer Models betreffen?
Auch diese Frage lässt sich nur mit der Wahl des - für das Projekt - richtige Pattern beantworten. Ich persönlich arbeite zumeist mit dem Transaction-Script-Pattern, weil es gefühlt leichter zu implementieren ist. In diesem Fall verarbeiten die Models (=eigetlich nur ein DTO) keine Logik, sondern das übernimmt ein Service.
Darf ein Model durchaus auch Logik enthalten, wobei der Controller nur den Anwendungsfluss bestimmt?
Ja, dann sprechen wir vom Domain-Object-Pattern in Verbindung mit MVC.

Hoffe das hilft dir!
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Anfänger Frage zu MVC

Beitrag von Well » 22.07.2013, 19:58:16

Hallo,

danke für deine Antwort.
Hallo Thalo,
Thalo bin ich leider nicht. :oops:

Von Transaction-Script-Pattern und Domain-Object-Pattern habe ich bislang noch nichts gelesen, das werde ich direkt nachholen, um dann die weiteren Antworten nachvollziehen zu können. Danke für den Hinweis.
Die Frage ist: "Was ist dein Client in diesem Zusammenhang?". Ich würde spontan sagen, dass die Synchronisation immer dann stattfindet, wenn eine Aktion getriggert wird (z.B. Bombe legen) und der Zustand auf dem Server gehalten wird. Änderungen - wenn wir konkret über eine JS-GUI sprechen, die mit AJAX-Calls mit dem "Backend", sprich der Applikation interagiert - werden dann per AJAX an die Applikation geliefert und dort kann ein Rückgabewert über die Änderung eines Lebens oder einer Position erfolgen.
Ich gehe von einer Desktop-Anwendung in Java aus.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Anfänger Frage zu MVC

Beitrag von dr.e. » 25.07.2013, 20:07:26

Hallo Werner,
Thalo bin ich leider nicht. :oops:
:oops: :roll: Peinlich, sorry! :) Habs direkt korrigiert.
Ich gehe von einer Desktop-Anwendung in Java aus.
In diesem Fall kannst du den Status entsprechend als Referenz innerhalb deiner Anwendung halten. Nutzt du das Domain-Objekt-Pattern kann der Status dabei direkt im Objekt gehalten werden und du musst an sich keine weitere Synchronisationslogik bauen - natürlich nur solange du auf der Referenz arbeitest.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast