4.8 KiB
#рефакторинг #запахи_кода
Большинство сред программирования основаны на широком применении набора примитивных типов: целых чисел, чисел с плавающей точкой и строк. Встречается немало программистов, которые не хотят создавать свои собственные фундаментальные типы, полезные для их предметной области, — например денежные единицы, координаты или диапазоны. И потому приходится встречаться с расчетами, которые рассматривают денежные суммы как простые числа; с вычислениями физических величин, которые игнорируют единицы измерений и добавляют дюймы к миллиметрам. Строки являются особенно яркими источниками запаха этого вида: номер телефона — это нечто большее, чем просто набор символов. Если даже такой тип не делает ничего иного — он по крайней мере включает согласованную логику отображения в пользовательском интерфейсе. Представление таких типов в виде строк является настолько распространенным запахом, что некоторые называют их “строково типизированными” переменными.
Признаки
- Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.)
- Использование констант для кодирования какой-то информации (например, константа
USER_ADMIN_ROLE = 1для обозначения пользователей с ролью администратора) - Использование строковых констант в качестве названий полей в массивах
Причины появления
- Программисту понадобилось поле для хранения каких-то данных. Он подумал, что создать поле элементарного типа куда проще, чем заводить новый класс
- Примитивные типы нередко используются для «симуляции» типов. Это когда вместо отдельного типа данных вы имеете набор чисел или строк, который составляет список допустимых значений для какой-то сущности. Зачастую этим конкретным числам и строкам даются понятные имена с помощью констант, что и является причиной их широкого распространения
Рефакторинги
- Замена примитива объектом (Replace Primitive with Object)
- Замена кода типа подклассами (Replace Type Code with Subclasses)
- Извлечение класса (Extract Class)
- Введение объекта параметра (Introduce Parameter Object)
Результат
- Повышает гибкость кода ввиду использования объектов вместо примитивных типов
- Улучшает понимание и организацию кода
- Операции над определёнными данными теперь собраны в одном месте, и их не надо искать по всему коду. Теперь не нужно догадываться, зачем созданы все эти странные константы и почему поля содержатся в массиве
- Может вскрыть факты дублирования кода


