2010-04-13 3 views
2

J'ai quelques classes de base/d'interface dont chacune a plusieurs classes dérivées. J'ai besoin de stocker des métadonnées sur chaque classe dérivée qui a beaucoup de chevauchement, mais des valeurs différentes.Question de conception: Métadonnées de classe de conservation pour la recherche dynamique

J'ai aussi une classe d'usine pour créer des instances des classes dérivées qui est mis en œuvre comme un singleton et a quelques macros. Par exemple, vous:

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 
} 

La question est: comment et où stocker les métadonnées d'un point de vue de la conception solide.

je pouvais stocker les données dans le ComponentRegister en tant que structure QMap. Quand quelqu'un enregistre un composant, ils pourraient également enregistrer ses métadonnées avec quelque chose comme

REGISTER_COMPONENT_METADATA("MyComponent", MyMap); 

Si le QVariant :: isValid() pour une clé particulière, vous savez les métadonnées est défini et disponible.

Une autre façon serait variables de classe statique ou peut-être une QMap de classe statique.

Je vois des avantages et d'en tirer le dos à la fois. La plupart des métadonnées sont des choses comme "chemin vers QResources pour cette classe" qui n'est pas étroitement lié à la logique métier de la classe elle-même.

Un autre problème avec la méthode variable de classe statique entre en jeu avec l'héritage. Vous ne pouvez pas appliquer la substitution de variables de classe statiques comme vous pouvez avec des fonctions virtuelles pures. Donc, si quelqu'un oublie ... il pourrait être difficile de savoir d'où proviennent les valeurs dans l'arbre d'héritage. Si vous avez besoin d'accéder aux métadonnées via une série de «getters» virtuels purs, le paramétrage des méta-données est réparti sur toutes les implémentations de la classe Base. Avec les données conservées, définies et recherchées dans le registre si vous avez besoin de faire des changements (comme changer le chemin racine pour les ressources), vous pouvez le faire en un seul point ... dans les appels d'enregistrement de classe, probablement un en-tête ou enveloppé dans une fonction d'utilité de l'application. Avec les données statiques, vous devez éditer chaque déclaration de classe.

Ouvert aux suggestions et merci!

Répondre

0

Si les données relatives à un objet n'est pas spécifique à une seule instance, comme le chemin dans votre exemple, mes créations comprennent généralement une classe qui gère ma collection d'objets. C'est là que je mets les méta-données.

exemple:

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

Le compte est des métadonnées sur les animaux.