Open suchja opened 8 years ago
Die Annahme des Kommandos übernimmt bei mir die Klasse Game
, die überprüft dann mit Hilfe der Command
Klasse, ob das Kommando gültig ist und führt es auch. Falls das Kommando eine Koordinate ist wird diese an die Klasse Gameboard
übergeben und dann der Spielstein gesetzt.
In der aktuellen Lösung habe ich die Eingabe erstmal in Main
gelassen. Ich möchte sie nicht in der Klasse Spiel
haben, weil ich die als eine meiner wichtigen Domänenklassen ansehe. Ich versuche die Domänenklassen, also solche, die die Kerngeschäftslogik realisieren, frei von jeglicher Ein- und Ausgabe zu halten. So kann ich sie auch in anderem Kontext als beispielsweise einer Konsolenanwendung verwenden. -> Diese Begründung widerspricht ein wenig meinem Ansatz das Design einfach zuhalten!
Ein weiterer Grund ist, dass die Eingabe bzw. insbesondere die Kommandos neu
und ende
für mich nicht ins Spiel
gehören. Wie in der Lebenszyklusbetrachtung beschrieben, wird bei einem Neustart das aktuelle Spiel
"entsorgt" und einfach eine neue Instanz der Klasse Spiel
angelegt. Das bedeutet, dass ein Spiel
nicht die Möglichkeit eines Neustarts hat und somit auch nicht die Kommandos neu
und beenden
verstehen muss.
Daher ist sowohl die Eingabe wie auch die Interpretation dieser Kommandos für mich nicht in der Klasse Spiel
anzusiedeln. Momentan habe ich auch keine andere passende Klasse dafür und belasse diese Funktionalität in somit in Program
. In den nächsten Schritten wird sich dann ergeben in welche andere Klasse diese Funktionalität vielleicht gehört.
NACHTRAG:
Was mich an der aktuellen Lösung stört ist die tiefe Schachtelung in der Main
Methode. Zusätzlich wird auch Single Level of Abstraction nicht eingehalten. Das nehme ich weiterhin in Kauf, weil ich noch eine möglichst einfach Lösung haben will.
Sowohl im Bereich Architekturmuster als auch Entwurfsmuster gäbe es bereits einige Ansätze die ich hier verwenden könnte (z.B. Model-View-Controller oder Kommandomuster). Das würde den Quellcode allerdings gleich wesentlich komplizierter machen. Damit haben es gerade Anfänger schwer den Quellcode zu verstehen und ich lenke mich selber vom eigentlich wichtigen, der Domäne, ab.
Aufgabe für den 30.06.16
Nachdem unsere Anwendung nun im Stande ist zwischen den beiden Spielern zu unterscheiden, sollten wir auch die Eingabe für jeden Spieler ermöglichen. Dabei kann die Eingabe falscher Koordinaten erstmal ignoriert werden.
Es sollte jedoch möglich sein, dass das Spielbrett erneut angezeigt wird, wenn ein Spielfeld besetzt ist.
Auch bei dieser Aufgabe wäre es gut, wenn Du mir deine Gedanken zum Design mitteilst. Warum hast du die Eingabe in welcher Klasse platziert?