1

ハードコーディングされた具体的な派生クラスとインスタンスを持つ ADT 基本クラスと、ファイル入力からインスタンスが構築される包括的なクラスのどちらが優れた設計ですか?

例:

class ADTSpell {
    ADTSpell(std::string name, int min_damage, int max_damage);
    virtual ~ADTSpell()=0;
    //...
};

class Fire : public ADTSpell {
    Fire() : ADTSpell("Fire", 14, 15) { }
    //...
};

/* Other concrete derived classes */

- また -

class Spell {
    Spell(std::string name, int min_damage, int max_damage, /*...*/ )
    //...
};

File: Spells.txt
Fire 14 15
Heal -3 -5
Ice 5 8
4

2 に答える 2

3

KISS (Keep It Simple) の原則では、単に使用することをお勧めします。

struct Spell
{
   std::string Type;
   int MinDamage;
   int MaxDamage;
};

要点は簡単です。すでにすべての呪文を一般化しています。原則として、それらは名前のみが異なります。パラメータ (最小/最大) はフィールドとして簡単に保存できます。これらはすべて、高度なポリモーフィズムを必要としません。

これらの「呪文」のコードのロード/保存は、クラスベースのソリューションよりも難しくありません。

より多くのパラメーター (発射体の種類など) が必要な場合は、この構造体にフィールドとして含めることができます。

さらに重要なことは、この「クラス」のインスタンスをネットワーク経由で渡すか、それらを Lua/Python/.NET などにマーシャリングしようとする場合は、std::string を char Type[FIXED_SIZE] またはさらに変更することを検討することです。 int Type に (いくつかの列挙を使用して)。

于 2012-05-31T19:20:30.080 に答える
1

私は実際には2番目と同様のことをしますが、より多くの機能が必要な場合は、それを拡張します。

class MultiTargetSpell : public Spell {
    public MultiTargetSpell(std::string name, int min_damage,
        int max_damage, TargetData targets) :
        Spell(name, min_damage, max_damage) { ... }
    ...
};

...
Spell fire = Spell("Fire", 14, 15);
Spell firestorm = MultiTargetSpell("Firestorm", 25, 30, everyone);
于 2012-05-31T20:01:54.993 に答える