Когда объект меняет свое состояние, лучшее решение — изменить атрибут, верно?
Проблемы
- Изменчивость
- Загрязнение атрибутов
- Сеттеры
Решения
- Используйте неизменяемые объекты
- Модель заявляет как математическое включение набора.
- Отделите состояние от объекта, так как оно случайно.
Примеры
- Диаграммы состояний
Образец кода
Неправильный
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.