2010-10-19 2 views
1

Говоря об списках атрибутов, я имею в виду общий список, который хранит дополнительную информацию для класса.Как бы вы реализовали списки атрибутов?

Простейший случай:
Класс имеет std::map<std::string, std::string>. Первая строка называет атрибут (например, "Color"), вторая строка описывает значение (например, "Yellow").
В этом примере другой класс, который использует эти атрибуты, должен проверить, существует ли на карте определенное имя-атрибут и затем проанализировать значение.
Однако это не лучшая концепция, говоря о производительности.

Как реализовать такой список атрибутов?
Есть ли какие-либо шаблоны дизайна или библиотеки, которые просто делают что-то подобное?

Меня особенно интересует C++ - способ сделать это, но если есть независимые от языка решения, отправьте их тоже.

Список атрибутов может использоваться в тех случаях, когда класс должен иметь динамические атрибуты, и пользователь не хочет наследовать для каждого атрибута.
Если это помогает, вы можете проверить мой другой вопрос, относящийся к этой теме:
Attributelists or inheritance jungle?

EDIT:
Конечно, я забыл какую-то информацию (благодаря комментариям):
Атрибуты могут быть применены к объектам , Для объектов одного и того же класса могут быть разные атрибуты. Атрибуты, которые может изменить объект (значение может меняться, могут быть добавлены/удалены атрибуты)
Надеюсь, это немного упростит его.

+0

Являются ли эти «атрибуты» для каждого класса или они предназначены для каждого объекта? Возможно ли, что атрибуты могут меняться во время выполнения? Как вы собираетесь использовать атрибуты? Это интересный вопрос, но вы не указали требования к спискам атрибутов. –

+0

В правом силико - вы разрабатываете это на основе ваших реальных требований к гибкости времени выполнения, использования памяти, производительности и т. Д. Это может быть карта enums/strings/ints/boost :: any to boost :: any, variant, abstract base классы и т. д., или если вы считаете, что ваш предыдущий вопрос о выборе между такими «списками атрибутов» и наследованием имеет значение, то это означает, что требования еще более неопределенны. –

ответ

2

Я сделал что-то подобное.

Если атрибуты являются общими для всех экземпляров вашего класса, сделайте отдельное мета-описание вашего класса, в котором вы описываете атрибуты. Затем на один экземпляр предоставляется простой вектор типа boost :: any (я не использую boost :: any, но что-то подобное, что мы написали сами).

Если атрибуты могут быть разными для каждого экземпляра, сделайте карту на экземпляр, где ключ является атомом, а значение boost :: any (или что-то подобное). Под Windows атомы представляют собой своеобразное числовое представление строки. Сначала используйте строки, чтобы указать «имя атрибута», затем преобразуйте это в атом и используйте это как ключ на карте. Использование числовых атомов вместо строк ускорит поиск атрибутов на карте (если вы где-то сохраняете значение атома, и вам не нужно выполнять поиск по цепочке на атом каждый раз, когда вы хотите получить значение атрибута).

Не используйте атрибуты в качестве обычного способа хранения элементов данных класса. Если вы это сделаете, отладка станет кошмаром, так как будет очень очень сложно понять, что представляют собой фактические значения в вашем классе. Кроме того, поставить очки будет невозможно.

использовать только эти атрибуты для хранения вещей, которые вы не можете поместить в обычном члене данных, например: - вы не знаете, атрибутов заранее (например, они могут быть по выбору заказчика) - вы не хотите ввести зависимость (даже по имени) между двумя классами

1

Посмотрите на dynamic property maps в Boost Property Map.

Динамическая свойство карты специально рассмотреть вопрос о необходимости для интерфейса к карт собственности которых проверен задерживается на время выполнения. Несколько компонентов объединяются для обеспечения поддержки динамических карт свойств . Класс dynamic_properties собирает группу гетерогенных объектов , которые представляют концепцию модели из библиотеки изображений Boost Property Map . Каждой карте свойств присваивается строковый ключ , когда он добавляется к коллекции, и это может быть , адресованное с использованием этого ключа. Внутри dynamic_properties адаптирует каждый содержал свойство карту с картой интерфейса динамическое свойство, которое обеспечивает получить и поставить функции, которые могут быть вызваны использованием значений любого типа , который отвечает ряду требований. Внутренне динамическая карта свойств преобразует пары ключей и значений в соответствие с требованиями . Требования базовой карты или сигналы времени выполнения Исключение, если оно не может.

Смежные вопросы