Изменение поведения системы на плате управления может быть мечтой заказчика, но может стать кошмаром для инженера-программиста.
Проблема
- Дублированный код
- Если загрязнение
- Глобальное использование
- "Связь"
- Тестируемость и бурный рост сценариев тестирования
- Сложность
Решение
- Избегайте прямого использования настроек
- Создавайте полиморфные объекты и внедряйте их извне.
Образец кода
Неправильный
class VerySpecificAndSmallObjectThatDealWithPersistence { fun retrieveData() = if (GlobalSettings.instance["I am A Possible Mistyped String"] != null) { retrieveDataThisWay() } else { retrieveDataTheOtherWay() } private fun retrieveDataThisWay() { // ... } private fun retrieveDataTheOtherWay() { // ... } } class GlobalSettings { private val settings = mutableMapOf<String, String>() operator fun set(key: String, value: String) { settings[key] = value } operator fun get(key: String) = settings[key] companion object { val instance = GlobalSettings() } }
Верно
class VerySpecificAndSmallObjectThatDealWithPersistence(private val retrieveStrategy: RetrieveStrategy) { fun retrieveData() = retrieveStrategy.retrieve() } interface RetrieveStrategy { fun retrieve(): String } class RetrieveFromDatabase : RetrieveStrategy { override fun retrieve(): String { return "Data from the database" } }
Примеры
- Параметры внешнего подключения
- Пользовательские настройки
- Переключение функций
Исключения
- Иногда мы используем переключение функций в качестве защитного механизма. Это допустимо в устаревшей системе. Однако эти переключатели должны быть очень недолговечными в системе CI/CD.
- Настройками гиперпараметров должны управлять объекты конфигурации. Вы можете считывать эти объекты с любого носителя сохраняемости и изменять поведение вашей системы во время выполнения явным и контролируемым образом.
Заключение
Настройка поведения во время выполнения отлично подходит для программных систем.
Мы должны настроить наши объекты, чтобы они могли вести себя по-разному, и мы должны достичь их явным образом с явными поведенческими объектами.
Таким образом, наш код будет более декларативным, чистым и тестируемым. Это не так просто, как добавить оператор IF. Такой ленивый разработчик привносит в наши системы множество взаимосвязей и неожиданных проблем.
Система с 300 булевыми конфигурациями имеет больше тестовых комбинаций (2^300), чем число атомов во Вселенной (10^80).
Надеюсь, вам понравилось это путешествие и вы узнали что-то новое. Если вы хотите быть в курсе моих последних мыслей и идей, не стесняйтесь подписаться на мою новостную рассылку. Вы также можете найти меня в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!
Кредиты
Первоначально опубликовано на https://yonatankarp.com.