Какие шаблоны проектирования могут быть применены к проблеме настроек конфигурации?
В больших и сложных программных продуктах управление настраиваемыми параметрами становится серьезной проблемой. Я видел два подхода к проблеме:
- пусть каждый компонент в системе загружает свою конфигурацию из файлов конфигурации или настроек реестра.
- иметь класс загрузчика настроек, который загружает все настраиваемые параметры системы и каждый компонент запрашивает загрузчик настроек для своих настроек.
Оба эти подхода кажутся мне неправильными.
Существуют ли какие-либо шаблоны проектирования, которые могут быть использованы для упрощения проблемы? Может быть, что-то, что воспользуется техникой внедрения зависимостей.
3 ответа
Я предпочитаю создавать интерфейс для настройки запросов, загрузки и сохранения. Используя внедрение зависимостей, я могу внедрить это в каждый компонент, который требует этого.
Это обеспечивает гибкость с точки зрения замены стратегии конфигурации и дает общую основу для всего, с чем можно работать. Я предпочитаю это одному глобальному "загрузчику настроек" (ваш вариант 2), тем более что я могу переопределить механизм конфигурации для одного компонента, если мне это абсолютно необходимо.
В настоящее время я работаю в системе, где конфигурация управляется одним глобальным одноэлементным объектом, который хранит карту ключей конфигурации со значениями. В общем, я хотел бы, чтобы это не было сделано таким образом, потому что это может привести к узким местам параллелизма в системе и небрежно для модульного тестирования и т. Д.
Я думаю, что Рид Копси имеет право на это (я проголосовал за него), но я определенно рекомендовал бы прочитать большую статью Мартина Фаулера о внедрении зависимости:
http://martinfowler.com/articles/injection.html
Небольшое дополнение тоже... если вы хотите провести какое-либо фиктивное модульное тестирование типа объекта, внедрение зависимостей, безусловно, является подходящим вариантом.
Как насчет этого. Вы определяете интерфейс, Конфигурируемый с единственным методом configure(конфигурация). Аргумент конфигурации - это просто хеш-таблица, которая связывает имена параметров конфигурации с их значениями.
Корневые объекты могут создавать хеш-таблицу конфигурации любым удобным для них способом (например, читать ее из файла конфигурации). Эта хеш-таблица может содержать параметры конфигурации для корневого объекта iselft, а также любой параметр, который может использовать один из его компонентов, субкомпонентов, суб-субкомпонентов (и т. Д.).
Затем корневой объект вызывает configure(конфигурацию) для всех его настраиваемых компонентов.
Вы можете создать несколько реализаций интерфейса, определяющего загрузчик конфигурации. В основном шаблон стратегии, в котором вы можете определить один базовый интерфейс как configLoader, а затем дополнительные различные реализации, такие как FileSystemLoader, ClasspathLoader, EnvVariablesLoader и т. Д. Подробности по этой ссылке