55

В больших и сложных программных продуктах управление настраиваемыми настройками становится основной болью. Два подхода, которые я видел к этой проблеме:Какие шаблоны проектирования могут применяться к проблеме с настройками конфигурации?

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

Эти подходы оба мне не нравятся.

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

+4

Почему, на ваш взгляд, вариант 2 не так ли? – ChaosPandion

+2

Обычно он реализуется как синглтон, хотя есть и другие способы его реализации. –

ответ

37

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

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

+0

привет, это будет хорошо, если у вас есть несколько образцов :) – issamux

17

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

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

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

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

+0

Кажется, что декоратор соответствует вашим потребностям. Вы можете создать декоратор Serializable, который сможет сделать классы сериализуемыми по-своему. Стратегия может быть использована для того, чтобы все объекты имели свою стратегию для сериализации. Те объекты, которые не требуют сериализации, могут использовать стратегию игнорирования. Те, кому нужно только сериализовать свои поля стратегии OnlyFields и так далее. Вы будете гибкими с добавлением новых вещей в свой конфиг. Конечно, все подходы к этому имеют свои плюсы и минусы. –

3

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

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

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