LernMoment / ttt-challenge

TicTacToe als C#-Konsolenanwendung im Rahmen der LernMoment C# Challenge
http://www.lernmoment.de/csharp-challenge/
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

Aufgabe #5 - Kommando eingeben #7

Open suchja opened 8 years ago

suchja commented 8 years ago

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?

ghost commented 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.

suchja commented 8 years ago

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.

suchja commented 8 years ago

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.