Как стать автором
Обновить

Антипаттерн Primitive obsession: практические способы устранения

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров5.1K
Всего голосов 15: ↑15 и ↓0+18
Комментарии10

Комментарии 10

Ценность примитивных типов - в простой сериализации. Есть вариант не городить обёрточные классы, а просто покрыть код юнит-тестами нормально. Тогда и перепутать process(userId, itemId) с process(itemId, userId) не получится. Тестами вообще многие пробелы в типизации закрыть можно.

В некоторых языках новые типы тоже не плохо это делают "из коробки" (ну или путем не сложных манипуляций). Тесты – это хорошо, но в данном случае немного поздно. Вместо того чтобы получить ошибку при компиляции (или в среде разработки при вводе) переносить определение настолько простой ошибки на тестирование мне кажется несколько чрезмерно.

А кто сказал, что тест будет написан только ради этой строчки? Просто она будет покрыта как минимум одним тестом, который проверяет некоторое поведение, частью которого является этот вызов.

Есть вариант не городить 100500 юнит-тестов для тривиальных проверок, а использовать систему типов, чтобы она облегчала нам жизнь. Эти 100500 тестов ещё и поддерживать потом надо.

Типизацией вообще многие виды простых тестов закрыть можно.

Как можно такое вообще перепутать? Даже если в процессе набора аннотация не показывается, то что мешает go to definition сделать, две секунды.

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

Особенно учитывая, что есть mapstruct и Jackson, которые, если нужно умеют разворачивать вложенные объекты.

username.value -> username

time.Duration из Go крайне неудачный пример типизации, потому что позволяет time.Sleep(time.Hour * time.Hour)

В тэги и/или перед первым примером кода нужно добавить язык примеров.

Спасибо! Здесь разные примеры кода на разных языках. Смена языка без предупреждения, действительно, может сбивать с толку. Добавил в текст перед рассмотрением примеров язык, когда он меняется. В тэги добавлять, думаю, не стоит, т.к. статья больше не про сами языки, а про подходы, которые в различных языках существуют.

За всю карьеру ни разу не встретил реального случая с перепутанными входными параметрами. Потому что IDE великолепно показывают порядок и ошибиться сложно. Даже если ошибся, код не отдается тестерам без проверки, а при дебаге или даже поверхностном просмотре сразу видно несоответствие. Я даже не говорю про юнит тесты, которые исключают подобные проблемы совсем. ИМХО проблема была описана когда код писали без IDE и любили передавать по 20 параметров. А потом стала не актуальной. Передавать всегда нужно так, чтобы код был простым и очевидным, чтобы работа не превращалась в героическое преодоление надуманных проблем. Это важнее чем страховка от очень очевидных и очень маловероятных ошибок.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации