2012-05-31 1 views
1

더 나은 디자인 : 하드 코딩 된 구체적인 파생 클래스 및 인스턴스 또는 모든 포함 클래스가있는 ADT 기본 클래스 인스턴스는 파일 입력으로 구축됩니까?C++ : ADT 하드 코딩 된 파생 클래스가있는 기본 클래스 v 파일 입력에서 빌드 된 모든 포함 클래스

예 :

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 

답변

3

키스 (간단하게) 원칙은 단지

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

요점은 사용을 제안 간단합니다 : 이미 모든 주문을 일반화했습니다. 원칙적으로 이름 만 다릅니다. 매개 변수 (최소/최대)는 필드로 쉽게 저장됩니다. 이 모든 것들은 고급 다형성을 필요로하지 않습니다.

이러한 "주문"을로드/저장하는 코드는 클래스 기반 솔루션보다 어려울 수 없습니다.

(발사체 유형과 같은) 더 많은 매개 변수가 필요한 경우에도이 구조의 필드로 포함될 수 있습니다.

네트워크를 통해이 "클래스"의 인스턴스를 전달하거나 루아/파이썬/.NET/무엇이든지 마샬링하려고한다면 std :: string을 char로 변경하는 것이 좋습니다. Type [ FIXED_SIZE] 또는 int 유형 (일부 열거 형)으로 변환됩니다.

1

저는 실제로 두 번째와 비슷한 것을 할 것입니다. 그러나 더 많은 기능이 필요한 경우 확장하십시오.

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);