#рефакторинг #запахи_кода ![[Pasted image 20241112225511.png]] > Большинство сред программирования основаны на широком применении набора примитивных типов: целых чисел, чисел с плавающей точкой и строк. Встречается немало программистов, которые не хотят создавать свои собственные фундаментальные типы, полезные для их предметной области, — например денежные единицы, координаты или диапазоны. И потому приходится встре­чаться с расчетами, которые рассматривают денежные суммы как простые числа; с вычислениями физических величин, которые игнорируют единицы измерений и добавляют дюймы к миллиметрам. > Строки являются особенно яркими источниками запаха этого вида: номер телефона — это нечто большее, чем просто набор символов. Если даже такой тип не делает ничего иного — он по крайней мере включает согласованную логику отображения в пользовательском интерфейсе. Представление таких типов в виде строк является настолько распространенным запахом, что некоторые называют их “строково типизированными” переменными. ### **Признаки** - Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.) - Использование констант для кодирования какой-то информации (например, константа `USER_ADMIN_ROLE = 1` для обозначения пользователей с ролью администратора) - Использование строковых констант в качестве названий полей в массивах ### **Причины появления** - Программисту понадобилось поле для хранения каких-то данных. Он подумал, что создать поле элементарного типа куда проще, чем заводить новый класс - Примитивные типы нередко используются для «симуляции» типов. Это когда вместо отдельного типа данных вы имеете набор чисел или строк, который составляет список допустимых значений для какой-то сущности. Зачастую этим конкретным числам и строкам даются понятные имена с помощью констант, что и является причиной их широкого распространения ![[Pasted image 20241112225523.png]] ### **Рефакторинги** - [[Замена примитива объектом (Replace Primitive with Object)]] - [[Замена кода типа подклассами (Replace Type Code with Subclasses)]] - [[Извлечение класса (Extract Class)]] - [[Введение объекта параметра (Introduce Parameter Object)]] ![[Pasted image 20241112225530.png]] ### **Результат** - Повышает гибкость кода ввиду использования объектов вместо примитивных типов - Улучшает понимание и организацию кода - Операции над определёнными данными теперь собраны в одном месте, и их не надо искать по всему коду. Теперь не нужно догадываться, зачем созданы все эти странные константы и почему поля содержатся в массиве - Может вскрыть факты дублирования кода ### **Ссылки** - [https://refactoring.guru/ru/smells/primitive-obsession](https://refactoring.guru/ru/smells/primitive-obsession) - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]