Представление параметров / конфигураций / настроек - PullRequest
1 голос
/ 04 мая 2009

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

Моя первоначальная мысль - просто сохранить все значения в одном классе, который доступен глобально (возможно, в Singleton), потому что эти значения будут использоваться в различных местах кода. Это, однако, сделает все другие классы зависимыми от этого синглтона.

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

Спасибо

Ответы [ 3 ]

1 голос
/ 04 мая 2009

"Это проблема [с конфигурацией Singleton]?

Не совсем.

"все остальные классы, зависящие от этого синглтона"

Не совсем. Вы можете легко спроектировать вещи так, чтобы некоторые классы получали конфигурацию и передавали ее другим классам.

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

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

«Есть ли другое, идеальное решение, о котором я не думал?»

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

«Как вы, люди, обычно представляете этот тип данных?»

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

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

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

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

«Есть ли что-то еще, что я должен знать об этой проблеме?»

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

1 голос
/ 04 мая 2009

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

0 голосов
/ 04 мая 2009

Это зависит от вашей конкретной ситуации.

Например, вы можете предоставить класс Context с помощью метода getParameter (String name) и setParameter (String name, Object value) и многие другие методы, которые вам нужны для сохранения параметров конфигурации.

Вы можете передать Context как параметр в конструкторе класса, который должен использовать config. Параметры:

public class ConfigUser {
   private Context c;
   public ConfigUser (Context c) {
      this.c = c;
   }
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...