Design Problem

Status
Nicht offen für weitere Antworten.

Bit2_Gosu

Bekanntes Mitglied
Hi!

Ich bin dabei, einen Schachcomputer zu programmieren. Es gibt eine Klasse "GUI", die auf ein Objekt der Klasse "Game" zugreifen kann. Das ist nötig, denn je nachdem, was der Benutzer klickt muss Einfluss auf das Spiel genommen werden. Nun ist es so, dass ein Bauer, der an die gegnerische Grundlinie gelangt umgewandelt werden kann.
Der Bentuzer schiebt den Bauer nach vorne --> es wird auf die Klasse "Game" einfluss genommen --> diese Stellt fest, dass der Bauer eingetauscht werden kann --> es öffnet sich ein Fenster, in dem sich der Benutzer eine Figur aussuchen kann.
Nun bedeutet aber der letzte "-->", dass die Klasse "Game" auf die Klasse "GUI" Einfluss nehmen muss, denn die GUI regelt alles Graphische. Das finde ich aber unschön, denn warum sollte eine Klasse "Game" etwas von irgendwelcher Graphik wissen.

Nun habe ich mir überlegt: Die Klasse Game setzt ein flag, dass von einem Thread der GUI regelmäßig gecheckt wird. Je nachdem öffnet sich ein Fenster.

Würdet ihr das auch so kompliziert machen, oder habt ihr vielleicht eine bessere Idee?
 

Michael...

Top Contributor
Würdet ihr das auch so kompliziert machen, oder habt ihr vielleicht eine bessere Idee?
Ich finde es ein bisschen merkwürdig, dass die GUI auf Game zugreift und nicht umgekehrt. Game ist - nehme ich an - der intelligente Teil und sollte der GUI sagen setze FigurX von Position X auf Y. Würde Dir wie @x.l raten sich mit dem MVC auseinander zu setzen und Dein Programm-Design zu überdenken.
 

Bit2_Gosu

Bekanntes Mitglied
Ah ja danke, sehr interessant.

Ich habe mir gerade den Wikipedia Artikel zum MVC-Konzept durchgelesen und habe dazu eine Frage:

Da steht "Im Regelfall wird die Präsentation über Änderungen von Daten im Modell mithilfe des Entwurfsmusters „Beobachter“ unterrichtet".

Ich hätte jetzt aber gedacht, der Controller wird über Änderungen von Daten im Modell mithilfe des Entwurfsmusters "Beobachter" unterrichtet und bewirkt über seine Verbindung zur View eine direkte Änderung der View.

Was meint ihr dazu?

Mein Programm hat jetzt übrigens folgende Struktur: Meine Klasse "Game" ist das Modell im MVC-Konzept und kennt weder GUI (also View) noch die Kontroller-Klasse (die ActionListener erweitert). Die View kennt nicht das Modell aber kennt den Controller. Der Controller kennt View und Modell. Wenn sich das Modell nun so ändert, das auch die View geändert werden muss, gibt das Modell die Information, dass sich etwas geändert hat über eine Methode an alle anonymen (!) Beobachter weiter. Ein Beobachter wäre in diesem Fall der Controller, der so benachrichtigt wird und im Anschluss die View direkt (!) informiert.
 

Michael...

Top Contributor
Ich hätte jetzt aber gedacht, der Controller wird über Änderungen von Daten im Modell mithilfe des Entwurfsmusters "Beobachter" unterrichtet und bewirkt über seine Verbindung zur View eine direkte Änderung der View.

Was meint ihr dazu?
Ich bin der Meinung das liegt im Ermessen des Programmierers und man kann es je nach Anwendungsfall so und so halten. Sicherlich kann man es so wie oben beschrieben machen. Würde mir allerdings die Frage stellen, ob Änderungen des Models für den Controller überhaupt interessant sind. Wenn nicht (das ist wohl in den meisten Fällen) würde ich die View als Beobachter ans Model hängen, denn die muss in Regel wissen, wenn sich was am Model ändert.
 

Marco13

Top Contributor
Dass "das GUI" auf's Game zugreift ist nicht falsch oder ungewöhnlich - das erfolgt schließlich über einen Listener, und der übernimmt hier die Rolle des Controllers. Es ist lediglich wichtig, dass das Game das GUI nicht direkt kennt. Das Game sollte nicht mal wissen, dass es überhaupt ein GUI gibt (was ja z.B. der Fall sein kann, wenn zwei KIs gegeneinander spielen - dann erscheint nach 42 Tagen und 17 Stunden einfach nur auf der Console "KI0 won" - nix mit GUI)

Dem MVC-Prinzip nach würde man das auch durch einen Listener lösen. Das ist jetzt SEHR hemdsärmelig und lapidar beschrieben, aber vom Prinzip her (!) KÖNNTE das sowas sein wie
Java:
interface GameListener
{
    void pawnReachedOppositeSide(GameEvent event);
    ...
}

class SimpleGame
{
    private List<GameListener> gameListeners = ... // add/remove-Methoden hierfür

    // Wird aufgerufen, wenn ein Bauer die gegnerische Seite erreicht
    private void firePawnReachedOppositeSideEvent(Pawn pawn)
    {
        for (all GameListeners) gameListener.pawnReachedOppositeSide(someEvent);
    }
}

class GUI implements GameListener
{
    private Game game = ...

    public void pawnReachedOppositeSide(GameEvent event)
    {
        // Wichtig: MODALER Dialog!!
        Piece newPiece = selectPieceWithModalDialog();
        game.replacePiece(event.getOldPiece(), newPiece);
    }
}
 

Marco13

Top Contributor
Wobei... Jetzt, wo ich drüber nachdenke... das löst vielleicht dein angedeutetes Problem mit der Verbindung zum GUI, aber ... eigentlich ist diese Abhängigkeit vom GUI an sich ja schon nicht sinnvoll .... Ich denke, man sollte eine Ebene drüber (d.h. schon im Spiel) mit der Lösung dieses Problems ansetzen: Eigentlich ist diese Figurenumwandlung ja komplett zum Spiel gehörig...bei einer KI (ohne GUI) müßte ja auch eine Figurumwandlung stattfinden... Die Auswahl, welche Figur man wählt, ist im Prinzip larifari - es gibt throretisch den Fall, dass man durch die Umwandlung in einen Springer ein Schachmatt erreichen kann, aber ansonsten ist die Auswahl (Dame) ja klar.... Ob das dann über einen Game-Listener gelöst werden sollte? Prinzipiell könnte man da jetzt wieder "rum-Engineeren", aber ... das ist eigentlich dein Job ;) Ich stelle nur mal in den Raum, ob nicht sowas vielleicht sinnvoller wäre:
Java:
interface PawnReplacementSelector
{
    public Piece getReplacingPiece(Pawn pawn);
}

class SimpleGame
{
    void inGame()
    {
        ...
        if (pawnHasReachedOppositeLine(pawn))
        {
            replacePiece(pawn, pawnReplacementSelectorOfActivePlayer.getReplacingPiece(pawn));
        }
        ...
    }


class HumanPawnReplacementSelector implements PawnReplacementSelector
{
    public Piece getReplacingPiece(Pawn pawn)
    {
        return ... // mit modalem Dialog ausgewähltes piece....
    }
}


class AIPawnReplacementSelector implements PawnReplacementSelector
{
    public Piece getReplacingPiece(Pawn pawn)
    {
        if (canWinWhenReturningKnight()) return someKnight;
        else return someQueen;
    }
}

Die Spieler bekommen dann jeweils den HumanPawnReplacementSelector / AIPawnReplacementSelector zugewiesen, oder implementieren das Interface jeweils selbst auf die angedeutete Weise...

Ich meine nur, dass für die Steuerung des komplett "Game-Inheränten Spielablauf" eigentlich keine Events verwendet werden müßten (oder sollten?) ... muss man sich mal überlegen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
N Checkstyle - Design for Extension Allgemeine Java-Themen 4
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
D Design Pattern: Singleton Allgemeine Java-Themen 4
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben