35 lines
4.8 KiB
Markdown
35 lines
4.8 KiB
Markdown
#рефакторинг #запахи_кода
|
||
|
||
![[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]] |