У меня есть пара базовых / интерфейсных классов, каждый из которых имеет несколько производных классов. Мне нужно хранить метаданные для каждого производного класса, который имеет много совпадений, но разные значения.
У меня также есть класс Factory для создания экземпляров производных классов, который реализован как одноэлементный и содержит несколько макросов. Например, вы бы:
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
}
Вопрос в том, как и где хранить метаданные с точки зрения твердого дизайна.
Я мог бы хранить данные в ComponentRegister в виде структуры QMap. Когда кто-то регистрирует компонент, он также может зарегистрировать его метаданные с чем-то вроде
REGISTER_COMPONENT_METADATA("MyComponent", MyMap);
Если QVariant :: isValid () для определенного ключа, вы знаете, что метаданные установлены и доступны.
Другим способом могут быть статические переменные класса или, может быть, статический класс QMap.
Я вижу преимущества и отступаю к обоим. Большинство метаданных представляют собой такие вещи, как «путь к QR-источникам для этого класса», который не тесно связан с бизнес-логикой самого класса.
Другая проблема со статическим методом переменной класса вступает в игру с наследованием. Вы не можете принудительно переопределить переменные статического класса, как с чистыми виртуальными функциями. Поэтому, если кто-то забудет ... может быть неясно, откуда в дереве наследования берутся значения. Если вам требуется доступ к метаданным через серию чистых виртуальных «получателей», то настройка метаданных распространяется на все реализации базового класса.
Если в реестре хранятся, устанавливаются и просматриваются данные, если вам нужно внести изменения (например, изменить корневой путь для ресурсов), вы можете сделать это в одной точке ... в вызовах регистрации класса, возможно, Заголовок или завернутый в служебную функцию приложения. Со статическими данными вам придется редактировать каждое объявление класса.
Открыт для предложений и спасибо!