TGViewer
Kotlin Kotlin @kotlin_lib · 2.05K subscribers
Post #680 843
💣 Почему я запрещаю Destructuring Declarations на код-ревью

Котлиновский синтаксис val (name, age) = user выглядит сексуально. Python-style, кратко, молодежно.
Но для бизнес-логики это мина замедленного действия.

Представим классический DTO для транзакции:


data class Transaction(
val amount: Double,
val fee: Double
)



Где-то в недрах UseCase вы пишете:


val (total, commission) = getTransaction()
// Логика: total - commission



Всё работает.
Пока через полгода другой разработчик (или вы же) не решит, что поля в дата-классе должны идти в алфавитном порядке, или просто добавит новое поле в начало конструктора.

Изменение:


data class Transaction(
val fee: Double, // 👈 Поменяли местами
val amount: Double
)



Результат:
Код компилируется. Тесты (если они мокали объект, а не порядок полей) могут пройти.
Но в продакшене total теперь равен fee, а commission равна amount.
Поздравляю, вы только что начислили пользователю комиссию вместо зарплаты.

Почему это происходит?
Деструктуризация в Kotlin не смотрит на имена переменных. Она тупо вызывает component1(), component2().
Если типы полей совпадают (как Double и Double выше) - компилятор молчит.

✅ Правило Сеньора:
Используйте деструктуризацию только для:

1. Pair и Triple (где порядок очевиден из названий first/second).
2. Map.Entry в циклах.
3. Локальных переменных, которые живут 2 строчки кода.

Для всего остального (особенно Domain Models и DTO) - только явный доступ к свойствам:
val total = tx.amount

У кого в проекте уже настроен Detekt на запрет деструктуризации? 👇

✍️ @kotlin_lib
  • 👍 9
  • 💯 2
  • ❤ 1
More from @kotlin_lib
  1. Aug 26, 2026🚧 Ваш Mutex тормозит корутины. Как перестать лочить и начать жить Вы пишете многопоточный…
  2. Jul 25, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  3. Jul 1, 2026🌪 Ваша дата в опасности: flatMapConcat vs Merge vs Latest Вам нужно взять поток ID-шников…
  4. Jun 24, 2026🤖 Android-приложение — это не только красивый экран. За ним стоят работа с внешним API, з…
  5. Jun 23, 2026🔮 Убийца бойлерплейта: Встречайте Context Parameters (Kotlin 2.x) Мы так привыкли к Depen…
  6. Jun 3, 2026Яндекс обновил Yandex Mobile Ads SDK для монетизации мобильных приложений — и это интересн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →