Свойства модуля имя-значение пары C ++ API framework - переосмысление? - PullRequest
7 голосов
/ 26 апреля 2011

Я часто сталкивался с API, которые позволяют пользователям получать и устанавливать различные параметры, управляющие работой модуля. Теперь я собираюсь написать еще один API свойств, но не хочу изобретать велосипед.

Ниже приведен типичный базовый код клиента:

setInt("bitrate", 1000);
setEnum("mode", MODE_FAST);
setStr("output file", "music.mp3");

Часто существуют десятки параметров, которые можно установить, и такие наборы свойств часто находятся в процессе непрерывной разработки.

Некоторые API умнее других, более продвинутые функции:

  • Иерархическая группировка свойств
  • Перечень свойств
  • Числовые параметры с принудительными минимумами и максимумами
  • Значения параметров по умолчанию
  • Настройки, которые включены, отключены или доступны только для чтения
  • Динамические параметры - настройки, которые появляются, исчезают, имеют минимальное / максимальное значение, становятся включенными, отключенными или доступны только для чтения в зависимости от состояния других параметров.
  • Свойства, доступные через ключ UUID, а не текстовое имя

Помимо средств доступа в стиле C в приведенном выше примере кода, я встречал фреймворки, которые могут:

  • Чтение / запись свойств в файл (например, XML)
  • Чтение / запись настроек в реестр Windows
  • Интерфейс с API-интерфейсами системных свойств, например IPersistPropertyBag
  • Имеют стандартные реализации GUI по умолчанию, например древовидная структура или список
  • Иметь расширения графического интерфейса, соответствующие минимуму / максимуму / включенному состоянию, уменьшая повторение в коде графического интерфейса.

Я хотел бы найти хорошо спроектированную публичную библиотеку, которая обеспечивает основу для всего вышеперечисленного, но до сих пор вычеркнула пробел. Мне известно о Boost.PropertyTree , но это всего лишь скелет. Существуют ли другие API-интерфейсы переносимых свойств, о которых мне следует знать?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Одним из ключевых элементов системы свойств Qt на самом деле является очень надежная реализация класса типов вариантов QVariant, которая позволяет избавиться от типизированных вызовов setInt, setString ....

Если вы овладели подобным классом с хорошим поведением, например, возможно Boost :: Variant или что-то подобное, система свойств довольно легко реализовать, используя карту строки в качестве вспомогательной части.

Одним из удобств системы свойств qt является то, что вы можете переопределять функции сеттера и геттера без необходимости знать о них пользователю. Например. учитывая, что ваш установщик универсальных свойств равен setProperty(name, value). Разработчик может в объявлении класса обозначить, что свойство «speed» имеет свой собственный установщик setSpeed(float value), поэтому, когда пользователь вашего класса вызывает универсальную версию setProperty("speed", 100), система вызовет setSpeed(100) в вашем экземпляре.

Если вам не нужны такие функции, вы, вероятно, можете реализовать свою собственную систему свойств. У Gamasutra есть часть по реализации отражения в C ++ , которая также может вам помочь.

0 голосов
/ 03 июня 2011

Если вы не возражаете против зависимости от Qt Core, то у Qt есть довольно хорошо спроектированная система свойств . Это значит, что вы будете полагаться на Qt's MOC .

...