Когда объект меняет свое состояние, лучшее решение — изменить атрибут, верно?

Проблемы

  • Изменчивость
  • Загрязнение атрибутов
  • Сеттеры

Решения

  1. Используйте неизменяемые объекты
  2. Модель заявляет как математическое включение набора.
  3. Отделите состояние от объекта, так как оно случайно.

Примеры

  • Диаграммы состояний

Образец кода

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

sealed class OrderState
data object OrderStatePending : OrderState()
data object OrderStateConfirmed: OrderState()

class Order(private val items: List<Int>) {

    private var state: OrderState = OrderStatePending

    fun changeState(newState: OrderState) {
        state = newState
    }
}

Верно

sealed class OrderState
data object OrderStatePending : OrderState()
data object OrderStateConfirmed: OrderState()

data class Order(val items: List<Int>, val state: OrderState)

val items = listOf(1, 2, 3)
val pendingOrder = Order(items, OrderStatePending)
val confirmedOrder = pendingOrder.copy(state = OrderStateConfirmed)

Исключения

  • Над дизайном
  • Проблемы с производительностью (если серьезный тест поддерживает это).

Заключение

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

Мы должны быть осведомлены и очень осторожны, как и с любым другим запахом.

Это подсказки, а не жесткие правила.

Будьте в курсе моих последних мыслей и идей, подписавшись на мою рассылку новостей. Свяжитесь со мной в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!

Спасибо, что дочитали до конца. Пожалуйста, следите за автором и этой публикацией. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное обучение программированию по всему миру.

Кредиты

Первоначально опубликовано на https://yonatankarp.com.