Какие шаблоны проектирования могут быть применены к проблеме настроек конфигурации?

В больших и сложных программных продуктах управление настраиваемыми параметрами становится серьезной проблемой. Я видел два подхода к проблеме:

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

Оба эти подхода кажутся мне неправильными.

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

3 ответа

Решение

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

Это обеспечивает гибкость с точки зрения замены стратегии конфигурации и дает общую основу для всего, с чем можно работать. Я предпочитаю это одному глобальному "загрузчику настроек" (ваш вариант 2), тем более что я могу переопределить механизм конфигурации для одного компонента, если мне это абсолютно необходимо.

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

Я думаю, что Рид Копси имеет право на это (я проголосовал за него), но я определенно рекомендовал бы прочитать большую статью Мартина Фаулера о внедрении зависимости:

http://martinfowler.com/articles/injection.html

Небольшое дополнение тоже... если вы хотите провести какое-либо фиктивное модульное тестирование типа объекта, внедрение зависимостей, безусловно, является подходящим вариантом.

Как насчет этого. Вы определяете интерфейс, Конфигурируемый с единственным методом configure(конфигурация). Аргумент конфигурации - это просто хеш-таблица, которая связывает имена параметров конфигурации с их значениями.

Корневые объекты могут создавать хеш-таблицу конфигурации любым удобным для них способом (например, читать ее из файла конфигурации). Эта хеш-таблица может содержать параметры конфигурации для корневого объекта iselft, а также любой параметр, который может использовать один из его компонентов, субкомпонентов, суб-субкомпонентов (и т. Д.).

Затем корневой объект вызывает configure(конфигурацию) для всех его настраиваемых компонентов.

Вы можете создать несколько реализаций интерфейса, определяющего загрузчик конфигурации. В основном шаблон стратегии, в котором вы можете определить один базовый интерфейс как configLoader, а затем дополнительные различные реализации, такие как FileSystemLoader, ClasspathLoader, EnvVariablesLoader и т. Д. Подробности по этой ссылке

Другие вопросы по тегам