種類が異なる有限数のアイテムを考えると、それらをスタックされた列挙型と列挙型コンストラクターで表すのが良いですか、それともサブクラス化するのが良いですか?それとも、より良いアプローチがありますか?
コンテキストを説明するために、私の小さなRPGプログラム(皮肉なことに単純なはずです)では、キャラクターのインベントリにさまざまな種類のアイテムがあります。アイテムは、タイプ、用途、効果によって異なります。
たとえば、インベントリの1つのアイテムは、ユーティリティ属性を調整するグレムリンと呼ばれる呪文の巻物です。別のアイテムは、戦闘で使用され、ダメージを与えるモートと呼ばれる剣である可能性があります。
私のRPGコードでは、在庫アイテムを表す2つの方法を試しました。1つの方法は、サブクラス化(たとえば、InventoryItem-> Spell-> AdjustingAttributes; InventoryItem-> Weapon-> Sword)を行い、必要に応じて各サブクラスをインスタンス化し、GremlinやMortなどの名前を割り当てることでした。
もう1つの方法は、列挙型と列挙型コンストラクターをスタックすることでした。たとえば、itemCategory、itemSpellTypes、itemWeaponTypesの列挙型を作成しましたが、InventoryItemの列挙型は次のようになりました。
public enum InventoryItem {
GREMLIN(itemType.SPELL, itemSpellTypes.ATTRIBUTE, Attribute.UTILITY),
MORT(itemType.WEAPON, itemWeaponTypes.SWORD, 30);
InventoryItem(itemType typeOfItem, itemSpellTypes spellType, Attribute attAdjusted) {
// snip, enum logic here
}
InventoryItem(itemType typeOfItem, itemWeaponTypes weaponType, int dmg) {
// snip, enum logic here
}
// and so on, for all the permutations of items.
}
これらの2つのアプローチよりも優れたJavaプログラミング手法はありますか?または、これらが唯一の方法である場合、2つのうちどちらが優れていますか?よろしくお願いします。