Мы с коллегой обсуждали рекомендации по управлению конфигурационным файлом, и мы хотели получить дополнительную информацию от других.Лучший способ управления конфигурационным файлом?
Наша цель состоит в том, чтобы файл конфигурации указывал, какое действие следует предпринять, когда происходят определенные события.
В 2 варианта, которые мы обсуждаем:
В конфиг-файле, указать класс-путь класса, который реализует меры, которые необходимо принять (например: «ActionToTake»: " com.company.publish.SendEveryoneAnEmailClass "). Внутри кода, когда это событие встречается, мы можем сделать Class.forName (config.ActionToTake) .newInstance(). Run(), чтобы вызвать указанное действие.
В конфиг-файл, указать удобочитаемое-фразу, действие, которое должно быть принято (например: "ActionToTake": "SendEveryoneAnEmail"). Внутри кода, когда это событие встречается, мы можем разобрать config.ActionToTake и выполнить отображение, которое переводит это осуществление действий (например: новый SendEveryoneAnEmailClass() Run().)
Мы в настоящее время очень маленькая команда, и в настоящее время единственными пользователями, которые читают/используют этот файл конфигурации, является наша команда разработчиков программного обеспечения. Но неясно, сохранится ли это в будущем.
Обоснование варианта 1: Любой, кто читает конфигурационный файл, явно и сразу узнает, какой класс будет вызван, и где он будет реализован. Это также позволяет реализовать/импортировать класс действия из полностью отдельного JAR-файла без перекомпиляции/изменения нашего кода.
Причина, связанная с вариантом 2: Файл конфигурации должен быть подробным описанием намерения пользователя и не должен содержать сведения о реализации, такие как конкретные имена классов & пути пакетов. Рефакторинг имен классов/пакетов также может быть выполнен без необходимости внесения изменений в файл конфигурации.
Мысли о том, какая из этих двух философий дизайна предпочтительна для конфигурационных файлов?
Другое и для меня самое важное преимущество варианта (1) состоит в том, что позже вы можете настроить ActionToTake как класс, который еще не был написан (или кто-то другой может настроить его со своим классом), все без каких-либо изменений в коде, который вызывает запуск в действии. Это очень похоже на то, как файлы конфигурации Spring работают для IOC, а IDE, например Eclipse, будет необязательно включать файлы конфигурации XML при рефакторинге классов и названий пакетов. – jas