Entwurfsmuster für Regelsysteme?

12

Als schnelles Spaßprojekt habe ich versucht, ein Solitairespiel zu schreiben. Aber beim Schreiben der Regelsysteme fühlte ich mich schmutzig , weil sich mein Code völlig unstrukturiert und nicht erweiterbar anfühlte , hauptsächlich, weil meine Spielelogik ein vollständiger Spaghetti-Code war.

Ich bin schon früher auf dieses Problem gestoßen und habe mich immer unwohl gefühlt, als ich diesen Teil meines Programms schrieb. Ich habe mich gefragt, ob es bewährte Best Practices gibt, wenn es darum geht, Regeln in einem Spiel zu definieren .

Dasuraga
quelle
1
Maximize Encapsulation und minimieren Kupplung
John McDonald

Antworten:

2

Ich glaube nicht, dass es eine einzigartige Lösung gibt, da viele Überlegungen von dem jeweiligen Problem herrühren.

Sie können das Model View Controller-Muster verwenden: Dadurch wird Ihr Problem auf "Implementieren eines Verhaltens auf dem Controller" beschränkt, ein Verhalten, das immer den Regeln folgt.

Wenn es sich nicht um sehr einfache Regeln handelt, ist die Art und Weise, wie Sie sie organisieren, ein Problem der Ausdruckskraft . Sie sehen sich immer wieder den widersprüchlichen Anforderungen gegenüber, einfach (strukturiert) und ausdrucksstark zu sein (Spaßregeln schreiben).

Die Verwendung der MVC vereinfacht Ihre Arbeit, da das Modell einen Status formalisiert, dh den Kontext, in dem die Regeln durchgesetzt werden.

Sagte , dass, Sie finden es sinnvoll , die Steuerung mit dem zur Umsetzung Strategiemuster und / oder die Zustandsmuster , um ein komplexes Verhalten in Bezug auf den einfacheren schaltbaren Verhaltensweisen zu komponieren. Ein Verantwortungskettenmuster kann Ihnen dabei helfen, Regeln auszudrücken, während eine Zustandsmaschine sorgfältig verwendet werden sollte, da ihr "Zustand" teilweise die Bedeutung des Modells von "Zustand" überlappt.

Verwenden des Befehlsmuster innerhalb des Controllers sein nützlich kann auf beide Controller - resposiblities reduzieren (der Befehl wissen , wie mit dem Modell zu tun) und machen es einfach , die hinzuzufügen Undo / Redo - Funktionen im Controller.

In jedem Fall sollten Sie versuchen, die Entwurfsmuster als Richtlinie zu verwenden: Sie sind nützlich, um zu vermeiden, dass das Rad, insbesondere das Vierkantrad, neu erfunden wird, aber nicht jede Problemlösung besteht aus einem Bündel von (runden) Rädern, die zusammengefügt werden.

FxIII
quelle
2

Ich bin mir nicht sicher, ob ich der Beste oder der Beste bin, aber ich benutze normalerweise das Observer-Muster . Es hat gut genug für mich funktioniert.

Ali1S232
quelle
1
Können Sie ein Beispiel geben?
Gustavo Maciel
Sie können für jede Regel einen Beobachter erstellen und diese dann an den Spielstatus anhängen. Nach jeder Runde fordert der Spielstatus alle Beobachter auf, zu prüfen, ob eine dieser Regeln angewendet wird.
Ali1S232
0

Wenn Sie den Job nicht schon oft erledigt haben, erhalten Sie immer Spaghetti-Code. Zu diesem Zeitpunkt haben Sie gerade erst begonnen: Was Sie haben, ist der grobe Entwurf einer vorläufigen Spezifikation. Lesen Sie hier einige der anderen Ratschläge und führen Sie einige ernsthafte Änderungen durch. Und dann noch etwas umschreiben, und dann ... Ich persönlich bin mir nie sicher, ob ich meinen Code in eine wirklich gute Form bringe oder es einfach satt habe, ihn umzuschreiben, aber ich scheine es es irgendwann richtig zu machen.

Das Problem von zwei Seiten angehen. Versuchen Sie, das Gesamtdesign sinnvoll zu gestalten und wählen Sie kleine Teile aus, die einfache Aufgaben bewältigen, und machen Sie sie richtig. Versuchen Sie dann, sich von beiden Enden zur Mitte durchzuarbeiten. Und dann von der Mitte zurück zu beiden Enden arbeiten. Dann von oben nach unten, dann von unten nach oben. Dann wiederholen Sie den gesamten Vorgang.

Im Wesentlichen haben Sie eine Sammlung von Klassen. Betrachten Sie Klasse A. Wenn Klasse A gut aufgebaut ist, funktionieren die Klassen, die sie verwenden, automatisch besser, egal wie gut oder schlecht sie sind. Wenn Klasse A Klassen gut verwendet, können diese Klassen mehr, egal wie gut oder schlecht sie sind. So organisieren Sie Ihre Klassen so gut Sie können, und stellen Sie dann sicher, dass jede Klasse die beste Klasse ist, die sie möglicherweise sein kann.

Es ist wichtig, es so richtig wie möglich zu machen. Schlechter Code verfolgt Sie bis zu dem Tag, an dem Sie ihn wegwerfen. Mit Software, ein bisschen extra Polieren immer zahlt sich aus. (Es sei denn, niemand benutzt den Code ...)

Um es zusammenzufassen: Sieh dir die tatsächlichen Ratschläge in den anderen Antworten an und schreibe deinen Code neu, bis du etwas bekommst, das dir gefällt.

RalphChapin
quelle
Ihre Antwort lautet also im Grunde "Lesen Sie die anderen Antworten und machen Sie sauberen Code oder Sie werden es bereuen" ...
kaoD
@kaoD: Ja. Aber auch: Ihr erster Codierungsversuch wird wahrscheinlich Junk sein. (Wenn nicht, sind Sie nicht stark genug.) Es wird eine Menge harter Arbeit erfordern, um es zusammenzubringen, zusammen mit ein wenig Recherche und viel Nachdenken. Dies ist beim Schreiben eines beteiligten Programms normal. Alle auf diese Weise aufgewendeten Anstrengungen sparen auf lange Sicht Zeit, Mühe und Kummer (wenn das Programm auf lange Sicht noch vorhanden ist). Und außerdem: OOP hilft sehr, wenn Sie den Dreh raus haben. (Das Beste, was ich tun kann, ohne den Code zu sehen.)
RalphChapin
4
Ist dir klar, dass du die Frage NICHT beantwortest?
KaoD
Unabhängig davon, ob Ralphs Beitrag technisch eine Antwort war oder nicht, hat Ralphs Antwort meiner Meinung nach das Motiv des OP zum Ausdruck gebracht, die Frage überhaupt zu stellen. Ich glaube, es hat viel Wert für einen Codierer, der nicht zu der Erkenntnis gekommen ist, dass es selten vorkommt, dass Sie Ihren Code beim ersten Versuch am besten entwerfen. Außerdem bot er einen Ansatz an, um damit umzugehen, der aus Ralphs Erfahrung geboren zu sein schien.
Steve H
@SteveH Ich denke, seine Antwort ist auf fast jeden Softwareentwicklungsprozess anwendbar. Sie könnten es überall kopieren und einfügen und es würde passen.
KaoD