Шаблон для управления конфигурацией приложения в поддерживаемом виде

Я ищу шаблон DRY для управления конфигурацией приложения в кроссплатформенном приложении C ++.

В идеале я хотел бы иметь единый источник конфигурации приложения, чтобы минимизировать затраты на обслуживание для разработчика. Это может быть сохранено как TXT, XML, JSON, YAML

Этот файл будет служить двум целям …

Во-первых, он используется для создания файла конфигурации, который был доступен для пользователя.

Во-вторых, он будет определять значения по умолчанию, которые будут использоваться в случае, когда пользователь решил удалить весь или часть своего файла конфигурации.

Варианты, которые я изучил …

  1. Наличие некоторого предварительного процессора компилирует файл конфигурации в приложение во время компиляции. Это не представляется возможным.

  2. Создайте инструмент, который читает файл конфигурации и генерирует необходимый код для компиляции по умолчанию в приложение. Это бы сработало, но усложняет процесс сборки, которого я хотел бы избежать.

  3. Создайте два файла конфигурации, один из которых настраивается пользователем, а другой содержит значения по умолчанию, которые скрыты. При запуске приложения читается файл по умолчанию, а затем читается файл пользователя, который применяет пользовательские настройки, переопределяя значения по умолчанию. Это не идеально, так как он использует скрытый файл для защиты значений по умолчанию от пользователя.

1

Решение

Config4Cpp обеспечивает прямую поддержку того, что вы хотите сделать. Для деталей, прочитайте обсуждение в Глава 3 Config4 * Руководство по началу работы о встроенной конфигурации (для жесткого кодирования ваших значений по умолчанию в исполняемый файл приложения) и резервная конфигурация (по сути, ищите значение запрошенной переменной в разобранном файле конфигурации, и если это не сработает, тогда «отступите» к поиску значения во встроенной конфигурации).

Если вы хотите использовать этот подход с другим синтаксисом файла конфигурации (например, json или XML), он сводится к следующим шагам:

  1. Напишите утилиту командной строки, похожую на config2cpp (обсуждается в Глава 6 Config4 * Руководство по началу работы это превращает файл конфигурации (или, фактически, любой текстовый файл) в (одноэлементный) класс C ++, который содержит снимок содержимого файла конфигурации, и может предоставить доступ к этому снимку с помощью общедоступного метода. Вы скомпилируете этот сгенерированный класс C ++ с остальной частью вашего приложения, поэтому в него встроены переменные конфигурации по умолчанию.

  2. Используйте синтаксический анализатор для вашего любимого синтаксиса файла конфигурации, но убедитесь, что анализатор может анализировать либо внешний файл, либо встроенный файл конфигурации. Другими словами, вы должны быть в состоянии выполнить cfg.parseFile("file.cfg") или же cfg.parseString(EmbeddedConfigurationClass::getString()),

  3. Напишите свой собственный класс API конфигурации «оболочки», который имеет два проанализировал конфигурационные объекты как переменные экземпляра. Одной из этих переменных будет проанализированный внешний файл конфигурации, а другой переменной — проанализированные встроенные данные конфигурации. Реализовать lookup() метод класса-оболочки, который сначала ищет указанную переменную в разобранном внешнем файле конфигурации; если это не удается, тогда метод ищет указанную переменную во встроенных данных конфигурации.

Это все, что нужно сделать. Config4 * предоставляет вам вышеуказанную функциональность «из коробки», но, как я уже описал в предыдущих шагах, должно быть легко эмулировать аналогичную функциональность для любого вашего любимого синтаксиса файла конфигурации.

Кстати, если вы реализуете эту функцию, то я рекомендую вам сделать внешний файл конфигурации необязательный. Это будет означать, что ваше приложение сможет работать «из коробки», и пользователю не потребуется сначала явно создавать файл конфигурации. В Config4 * я называю это нулевая конфигурация.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector