Эволюция антипаттернов Java/Kotlin

Анти-паттерны — полная противоположность паттернам.

Если паттерны проектирования — это примеры практик хорошего программирования, то есть шаблоны решения определённых задач. То анти-паттерны — их полная противоположность, это — шаблоны ошибок, которые совершаются при решении различных задач.

Кто осведомлен, тот и вооружён!

Данный пост является лишь тезисами к прикрепленному видео.

Источник

Докладчик: Михаил Горюнов

Михаил Горюнов - Эволюция антипаттернов Java/Kotlin

Антипаттерн - способ решения задачи неоптимально.

Антипаттерны из доклада:

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/1.png

  • Синглтон

В синглтоне не должно быть изменяемого состояния.

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/2.png

Это синглтон с ленивой инициализацией, т.к. классы загружаются лениво. Так же он потокобезопасный так как static однопоточный.

В котлине же убрали “муки” выбора и высекли реализацию в камне:

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/3.png

  • Синглтон с параметрами, так лучше не делать:

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/4.png

Так показывает гугл и тоже лучше не делать (пример с билд дб):

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/5.png

Но вместо такого синглтона лучше заюзать класс и договорится о способе передачи.

  • Использование enum для switch как константа с типом

Но это плохо, т.к. в Java такой код скомпилируется, хотя мы забыли Anonymous.

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/6.png

В Kotlin эта проблема решена с помощью when:

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/7.png

При добавлении полей в Role код не будет компилироваться т.к. when обязует проверять все поля.

  • В Kotlin есть Data class и они эффективны и несут добро если их правильно применять.

Добавления Data к Class говорит компилятору : “Пройдись по всем полям в primary конструкторе, сгенерируй на их основе hash и equals, toString, componentN, copy. (https://kotlinlang.ru/docs/reference/idioms.html)

ComponentN нужен для Destructuring (как struct binding в ++):

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/8.png

Антипаттерн заключается в использовании data в классах которые этого не требуют (например в классах для парса ответов через Retrofit+Gson):

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/9.png

  • Destructuring не кортежей

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/10.png

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/11.png

Ошибки компиляции нет, но смысловая ошибка есть.

Совет: Использовать только для позиционных структур + Только от разных типов

/my_grimoire/images/posts_includes/evolve_antipatterns_java_kotlin/12.png

  • Антипаттерн: Всегда давать значения по умолчанию либо задавать null. Лучше не использовать nullable и var там где это не нужно, например создавать пользователя без имени бессмысленно.

  • Антипаттерн: создавать свалку констант или глобальные константы всегда. Лучше уменьшать видимость констант на сколько это возможно.

  • Антипаттерн: Не использование StringKey в java и типизированных property в Kotlin. (https://kotlinlang.ru/docs/reference/delegated-properties.html)

Полезные ссылки

comments powered by Disqus