Was ist besser Java-Programmierpraxis: Stapeln von Enums und Enum-Konstruktoren oder Unterklassen?

7

Ist es angesichts einer endlichen Anzahl von Gegenständen, die sich in der Art unterscheiden, besser, sie mit gestapelten Enums und Enum-Konstruktoren darzustellen oder sie zu untergliedern? Oder gibt es insgesamt einen besseren Ansatz?

Um dir etwas Kontext zu geben, hat ein Charakter in meinem kleinen RPG-Programm (das ironischerweise als einfach gelten soll) verschiedene Arten von Gegenständen in seinem Inventar. Die Artikel unterscheiden sich je nach Art und Verwendung und Wirkung.

Zum Beispiel ist ein Gegenstand des Inventars ein Zauberspruch namens Gremlin, der das Utility-Attribut anpasst. Ein weiterer Gegenstand könnte ein Schwert namens Mort sein, das im Kampf eingesetzt wird und Schaden verursacht.

In meinem RPG-Code habe ich jetzt zwei Möglichkeiten zur Darstellung von Inventarelementen ausprobiert. Eine Möglichkeit war das Unterklassifizieren (zum Beispiel InventoryItem - & gt; Spell - & gt; AdjustingAttributes; InventoryItem - & gt; Weapon - & gt; Sword) und das Instanziieren jeder Unterklasse bei Bedarf und das Zuweisen von Werten wie Namen Gremlin und Mort.

Der andere Weg war das Stapeln von Enums und Enum-Konstruktoren. Zum Beispiel habe ich Enums für itemCategory und itemSpellTypes und itemWeaponTypes erstellt, und die InventoryItem-Enumeration war wie folgt:

%Vor%

Gibt es eine bessere Java-Programmierpraxis als diese beiden Ansätze? Oder wenn dies die einzigen Möglichkeiten sind, welche der beiden ist besser? Vielen Dank im Voraus für Ihre Vorschläge.

    
Arvanem 21.04.2010, 07:28
quelle

3 Antworten

6

In dem Kontext, den Sie beschreiben, würde ich eine Klassenhierarchie im Gegensatz zu enum-Definitionen verwenden und diese Hierarchie mit Schnittstellen ergänzen; z.B.

%Vor%

Der Hauptvorteil dieses Ansatzes besteht darin, dass Sie ein bestimmtes Objekt in verschiedenen Kontexten behandeln können (als InventoryItem s oder als Liste von Usable s). Der andere Grund, den ich von Enums weglassen würde, ist, dass Sie wahrscheinlich Verhalten auf Ihren Artikeln definieren werden (z. B. spell.cast(Person) ) und das ist nicht gut in Enums IMHO sitzen.

    
Adamski 21.04.2010, 07:44
quelle
8

Aufzählungen sind gut, wenn sie nur statische Daten und sehr minimale logische Daten enthalten (vorzugsweise keine Logik). Wenn Ihre Objekte abhängig von ihrer Art unterschiedliche Verhaltensweisen haben sollen, ist es normalerweise eine gute Idee, sie als Unterklassen zu implementieren.

Wie bereits erwähnt, werden Sie sehr wahrscheinlich Attribute zu Ihren Objekten hinzufügen, und diese Attribute sind nicht für alle Arten sinnvoll. Z.B. Ein Farbattribut ist sinnvoll für eine Waffe, aber nicht für einen Zauberspruch. In diesem Fall sollten Waffe und Zauberspruch nicht in der gleichen Reihenfolge sein.

    
Guillaume 21.04.2010 07:33
quelle
6

Wenn Sie den Elementen neue Attribute hinzufügen möchten, könnte es einfacher sein, sie als Unterklassen zu implementieren. Wenn auf diese Weise eine Gruppe von Elementen ein neues Attribut erhält, wird sie an alle Unterklassen weitergegeben.

Wenn beispielsweise allen Arten von Weapon ein bestimmtes Gewicht zugewiesen wird, fügen Sie dieses Attribut einfach zu dieser Klasse hinzu. Dieses Attribut wird dann an Unterklassen weitergegeben.

In Bezug auf andere Dinge, die statischer Natur sind und somit direkt einem Typ zugeordnet werden können, sind enums gut. Ich denke hier frei, also könnte ich einem Weapon ein DamageType zuweisen:

%Vor%     
Lars Andren 21.04.2010 07:35
quelle