Анти-паттерны — полная противоположность паттернам.
Если паттерны проектирования — это примеры практик хорошего программирования, то есть шаблоны решения определённых задач. То анти-паттерны — их полная противоположность, это — шаблоны ошибок, которые совершаются при решении различных задач.
Кто осведомлен, тот и вооружён!
Данный пост является лишь тезисами к прикрепленному видео.
Источник
Докладчик: Михаил Горюнов
Михаил Горюнов - Эволюция антипаттернов Java/Kotlin
Антипаттерн - способ решения задачи неоптимально.
Антипаттерны из доклада:
- Синглтон
В синглтоне не должно быть изменяемого состояния.
Это синглтон с ленивой инициализацией, т.к. классы загружаются лениво. Так же он потокобезопасный так как static однопоточный.
В котлине же убрали “муки” выбора и высекли реализацию в камне:
- Синглтон с параметрами, так лучше не делать:
Так показывает гугл и тоже лучше не делать (пример с билд дб):
Но вместо такого синглтона лучше заюзать класс и договорится о способе передачи.
- Использование enum для switch как константа с типом
Но это плохо, т.к. в Java такой код скомпилируется, хотя мы забыли Anonymous.
В Kotlin эта проблема решена с помощью when:
При добавлении полей в Role код не будет компилироваться т.к. when обязует проверять все поля.
- В Kotlin есть Data class и они эффективны и несут добро если их правильно применять.
Добавления Data к Class говорит компилятору : “Пройдись по всем полям в primary конструкторе, сгенерируй на их основе hash и equals, toString, componentN, copy. (https://kotlinlang.ru/docs/reference/idioms.html)
ComponentN нужен для Destructuring (как struct binding в ++):
Антипаттерн заключается в использовании data в классах которые этого не требуют (например в классах для парса ответов через Retrofit+Gson):
- Destructuring не кортежей
Ошибки компиляции нет, но смысловая ошибка есть.
Совет: Использовать только для позиционных структур + Только от разных типов
-
Антипаттерн: Всегда давать значения по умолчанию либо задавать null. Лучше не использовать nullable и var там где это не нужно, например создавать пользователя без имени бессмысленно.
-
Антипаттерн: создавать свалку констант или глобальные константы всегда. Лучше уменьшать видимость констант на сколько это возможно.
-
Антипаттерн: Не использование StringKey в java и типизированных property в Kotlin. (https://kotlinlang.ru/docs/reference/delegated-properties.html)
Полезные ссылки
- Идиомы Kotlin - https://kotlinlang.ru/docs/reference/idioms.html
- Делегированные свойства (Delegated properties) - https://kotlinlang.ru/docs/reference/delegated-properties.html
- Java and Kotlin antipattern evolution - https://gist.github.com/Miha-x64/9a8fb9fbb3fee47eb537bfc12361daa4
- Android Architecture Components. Часть 4. ViewModel - https://habr.com/ru/post/334942/
- Знакомство с android architecture components и MVVM (перевод) - https://medium.com/@nyavorskii/знакомство-с-android-architecture-components-и-mvvm-перевод-29654672f4ab