Laden...

Designfrage "Rezeptsystem"

Erstellt von Tarion vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.569 Views
T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 13 Jahren
Designfrage "Rezeptsystem"

Folgende Situation. Ich habe verschiedene Klassen (Spieler), die etwas lernen können. Aus einem Pool von Rezepten. Jedes Rezept hat eigene Regeln, die sich beim anwenden des gelernten auswirken.
Rezepte beinhalten auch Referenzen auf andere Klassen des Gesamt Systems.

Jetzt ist die Frage wie man die Regeln implementiert. Im gewissen Sinne könnten die alles Singletons sein, weil die Regeln ja einzigartig sind. Jedes Rezept wäre eine Klasse die vom Basisrezept ableitet.
Singleton für mehrere hundert Klassen halte ich nun aber nicht für den richtigen Weg.

Das Singleton könnte man auch weglassen, und nur über eine Factory die Objekte beziehen, halte ich aber auch nicht für gut, da es niemanden daran hindert trotzdem "New" zu schreiben.

Nächster Ansatz wäre aus den Rezepten einen Datentyp zu machen und sie dann mit einem überladenen Gleichheitsoperator aus zu statten, der 2 Rezepte auf Gleichheit prüfen kann. Ein Rezept verliert damit seine Identität, die es ja auch eigentlich nicht haben soll.
Zu diesem Ansatz tendiere ich aktuell.

Als letztes habe ich noch das Flyweight Pattern im Kopf. Das ist wohl ähnlich wie der Ansatz mit den Datentypen nur auf Objektbasis. Eine Klasse für alle Objekte, aber auch hier werde ich wohl den Gleichheitsoperator überladen müssen um die Identität los zu werden, dann kann ich auch gleich Sturcts nehmen.

Gibt es noch einen Ansatz der genau mein Problem trifft? Würde gerne ein wenig darüber diskutieren.

731 Beiträge seit 2006
vor 13 Jahren

Ich stelle mir gerade die Frage ob die fachliche Einzigartigkeit von Rezepten überhaupt etwas mit der Einzigartigkeit von Objektinstanzen zu tun hat. Ich denke mal eher nicht.

T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 13 Jahren

Eben, dass würde für den Datentyp sprechen. Zudem hat ein Repzept selbst keinen variablen Zustand. Wenn man ein Rezepzt ändert, ist es ein neues Rezept.

Ich hätte zudem immer noch eine Factory für die Rezepte welche Rezepte für bestimmte Berufe gleich als ganze Liste ausspuckt.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Tarion,

pauschal kann man schon mal sagen: Strategy-Pattern. Aber "mehrere hundert Klassen" macht auch mich stutzig. Normalerweise schreibt man ja eine Klasse, um davon beliebig viele Objekte zu erzeugen, die dann die konkreten Ausprägungen darstellen. Wenn der Wunsch entsteht für jedes Objekt seine eigene Klasse schreiben will, klingt das erstmal falsch oder zumindest ungünstig.

Die Frage ist "was genau ist ein Rezept"?

herbivore

T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 13 Jahren

Ein Rezept definiert wie etwas hergestellt wird. Dafür sind viele Informationen Norwendig, wie das benutzte Werkzeug, Benötige Items, Resultat Item, Anforderung an den Hersteller, etc..

Es wird in jedem Fall nur eine (oder wenige) Rezeptklassen geben.

Es darf im ganzen System aber nur genau definierte Rezepte geben, dafür die Factory.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Tarion,

Es wird in jedem Fall nur eine (oder wenige) Rezeptklassen geben.

das ist schonmal der richtige Entschluss.

Das Singleton könnte man auch weglassen, und nur über eine Factory die Objekte beziehen, halte ich aber auch nicht für gut, da es niemanden daran hindert trotzdem "New" zu schreiben.

Wenn die Konstruktoren alle private oder protected sind, schon. Außerdem kannst du in der Fabrik sicherstellen, dass zu jedem Rezept maximal ein Objekt erstellt wird. Dann brauchst du nichtmal Equals zu überschreiben.

herbivore

D
13 Beiträge seit 2010
vor 13 Jahren

Singleton sollte man nicht mehr verwenden dafür gibt es das Monostate Pattern

Singleton vs Monostate

Außerdem sollte man wenn man Equals überschreibt auch GetHashCode überschreiben.
Richtlinien für das Überschreiben von Equals und ==

Außerdem bei ValueTypes sollte man immer die Equals Methode überschreiben...

If you are implementing a value type, you should consider overriding the Equals method to gain increased performance over the default implementation of the Equals method on ValueType. If you override Equals and the language supports operator overloading, you should overload the equality operator for your value type.

U
237 Beiträge seit 2007
vor 13 Jahren

Hier sollte man doch lieber das Decorator Pattern anwenden anstatt Tausend Klassen zu schreiben, oder?

Allerdings stelle ich mir das gerade schwierig vor die Rezepte auf Gleichheit zu prüfen aufgrund der Reihenfolge der Zutaten, die ja auch eine Rolle spielen muss, wenn ich das richtig verstanden habe.

heute code ich, morgen debug ich und übermorgen cast ich die königin auf int