Использование функции переключения функций и IoC вместо кода ветвления - хорошая или плохая идея?
Наши клиенты могут выбирать, когда обновляться. Итак, моя команда буквально должна поддерживать и поддерживать десятки версий нашего программного продукта. Как вы можете себе представить, это приводит к большому количеству ветвлений и слияний, поскольку во всех этих разновидностях должны распространяться оперативные исправления и пакеты обновления. Я не доволен ситуацией. Очевидное решение - просто не поддерживать столько разных версий нашего продукта, но это очевидное решение мне недоступно. Итак, я изучаю творческие возможности, чтобы снизить объем работ по обслуживанию команды. Я рассматриваю возможность использования сочетания Feature Toggling и IoC для реализации n-ти версий нашего программного продукта. Идея состоит в том, чтобы я мог использовать единую кодовую базу для своего продукта и управлять поведением и функциями через управление конфигурацией. Это было бы вместо того, чтобы распространять код по нескольким ветвям. Это разумный подход или я просто заменяю одну проблему на другую?
1 ответ
Это звучит разумно, так как я бы решил эту проблему в новой среде.
Давайте не будем называть это переключателем функций. Как следует из названия, функция Toggle - это переключатель включения / выключения, который может не соответствовать вашим потребностям.
Иногда обновление также включает изменение поведения существующих функций. Это означает, что вам, вероятно, понадобится что-то более сложное, чем двухпозиционный переключатель.
Паттерн " Стратегия" - более гибкий способ моделирования изменений в поведении. Каждая стратегия может представлять определенную версию определенного поведения, и если вы вообще не хотите этого поведения, вы можете предоставить реализацию Null Object. Другими словами, Feature Toggle может быть реализован со Стратегией.
Вы можете внедрить Стратегии в ядро вашего приложения, используя Dependency Injection, и вы можете сделать выбор Стратегий настраиваемым через систему конфигурации. Большинство DI-контейнеров, о которых я слышал (в.NET и Java), поддерживают конфигурацию на основе файлов.
Это по существу описываетархитектуру надстройки.
Теперь даже для нового приложения это нелегко сделать. Если у вас безголовая система, это не так сложно, но как только вы подключите пользовательский интерфейс, вы начнете понимать, что вам также понадобится компонентизировать архитектуру пользовательского интерфейса, чтобы вы могли подключать элементы пользовательского интерфейса с помощью стратегий.
На десятилетней базе кода это было бы то, что я бы назвал "интересным испытанием", если не сказать больше.