2010-04-13 7 views
2

각 클래스에는 몇 가지 파생 클래스가있는 몇 가지 기본/인터페이스 클래스가 있습니다. 오버랩이 많이 있지만 파생 된 각 파생 클래스에 메타 데이터를 저장할 필요가 있습니다.디자인 질문 : 동적 조회 용 클래스 메타 데이터 보유

또한 싱글 톤으로 구현되고 몇 개의 매크로가있는 파생 클래스의 인스턴스를 만들기위한 팩토리 클래스가 있습니다. 예를 들어 다음과 같습니다.

REGISTER_COMPONENT("MyComponent", MyComponentClass); 
// create an instance of each component 
BaseComponent *base; 
foreach(QString component, ComponentRegister::componentList()) 
{ 
    base = ComponentRegister::create(component); 
    // do stuff with base 
} 

질문은 다음과 같습니다. 단단한 디자인 관점에서 메타 데이터를 저장하는 방법 및 위치.

QMap 구조로 ComponentRegister에 데이터를 저장할 수 있습니다. 누군가가 구성 요소를 등록 할 때 특정 키에 대한 QVariant :: isValid()는, 당신이 알고있는 메타 데이터 설정을 사용할 경우, 그들은 또한

REGISTER_COMPONENT_METADATA("MyComponent", MyMap); 

처럼 뭔가의 메타 데이터를 등록 할 수 있습니다.

또 다른 방법은 정적 클래스 변수이거나 정적 클래스 QMap 일 수 있습니다.

두 가지 모두에 장점과 단점이 있습니다. 대부분의 메타 데이터는 "이 클래스의 QResources 경로"와 같은 것으로 클래스 자체의 비즈니스 로직과 밀접하게 연결되어 있지는 않습니다.

정적 클래스 변수 메서드의 또 다른 문제는 상속에 관련되어 있습니다. 순수 가상 함수로 할 수있는 것처럼 정적 클래스 변수를 재정의 할 수 없습니다. 따라서 누군가가 잊어 버린 경우 ... 상속 나무에서 어디에서 값이 오는지 명확하지 않을 수 있습니다. 일련의 순수 가상 "getters"를 통해 메타 데이터에 액세스해야하는 경우 MetaData 설정은 Base 클래스의 모든 구현에 걸쳐 적용됩니다.

변경 사항을 저장해야하는 경우 (리소스의 루트 경로 변경과 같은) 데이터를 보유, 설정 및 조회 한 경우 클래스 등록 호출에서 한 번에 그렇게 할 수 있습니다. 헤더 또는 응용 프로그램 유틸리티 기능으로 랩핑됩니다. 정적 데이터를 사용하면 각 클래스 선언을 편집해야합니다.

제안 및 감사의 표시!

답변

0

개체에 관련된 데이터가 예제의 경로와 같이 단일 인스턴스에만 해당되지 않는 경우 내 디자인에는 일반적으로 개체 컬렉션을 관리하는 클래스가 포함됩니다. 그것이 메타 데이터를 저장하는 곳입니다.

예 :

class zoo { std::vector<animals> zoo_animals; size_t count; } 

수는 동물에 대한 메타 데이터입니다.