Изменение поведения системы на плате управления может быть мечтой заказчика, но может стать кошмаром для инженера-программиста.

Проблема

  • Дублированный код
  • Если загрязнение
  • Глобальное использование
  • "Связь"
  • Тестируемость и бурный рост сценариев тестирования
  • Сложность

Решение

  • Избегайте прямого использования настроек
  • Создавайте полиморфные объекты и внедряйте их извне.

Образец кода

Неправильный

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.