---
title: "Одержимость элементарными типами"
type: "code-smell"
slug: "primitive-obsession"
url: "http://localhost:3000/ru/smells/primitive-obsession.md"
category: "Раздувальщики"
description: "Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.)Использование констант для кодирования какой-то информации (например, константа USER_ADMIN_ROLE = 1 для обозначения пользователей с ролью администратора).Использование строковых констант в качестве названий полей в массивах."
---
# Одержимость элементарными типами

> Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.)Использование констант для кодирования какой-то информации (например, константа USER_ADMIN_ROLE = 1 для обозначения пользователей с ролью администратора).Использование строковых констант в качестве названий полей в массивах.

## Signs and Symptoms

* Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.)
* Использование констант для кодирования какой-то информации (например, константа `USER_ADMIN_ROLE = 1` для обозначения пользователей с ролью администратора).
* Использование строковых констант в качестве названий полей в массивах.

## Reasons for the Problem

Как и большинство других запахов, этот начинается с маленькой слабости. Программисту понадобилось поле для хранения каких-то данных. Он подумал, что создать поле элементарного типа куда проще, чем заводить новый класс. Это и было сделано. Потом понадобилось другое поле, и оно было добавлено схожим образом. Не успели оглянуться, как класс уже разросся до грандиозных размеров.

Примитивные типы нередко используются для «симуляции» типов. Это когда вместо отдельного типа данных вы имеете набор чисел или строк, который составляет список допустимых значений для какой-то сущности. Зачастую этим конкретным числам и строкам даются понятные имена с помощью констант, что и является причиной их широкого распространения.

Ещё одним плохим способом использования примитивных типов является «симуляция» полей. При этом класс содержит большой массив разнообразных данных, а в роли индексов массива для получения этих данных используются строковые константы, заданные в классе.

## Payoff

* Повышает гибкость кода ввиду использования объектов вместо примитивных типов.
* Улучшает понимание и организацию кода. Операции над определёнными данными теперь собраны в одном месте, и их не надо искать по всему коду. Теперь не нужно догадываться, зачем созданы все эти странные константы и почему поля содержатся в массиве.
* Может вскрыть факты дублирования кода.
## Relations

**Treated by**

- [Замена простого поля объектом](/ru/replace-data-value-with-object.md)
- [Замена параметров объектом](/ru/introduce-parameter-object.md)
- [Передача всего объекта](/ru/preserve-whole-object.md)
- [Замена кодирования типа классом](/ru/replace-type-code-with-class.md)
- [Замена кодирования типа подклассами](/ru/replace-type-code-with-subclasses.md)
- [Замена кодирования типа состоянием/стратегией](/ru/replace-type-code-with-state-strategy.md)
- [Замена поля-массива объектом](/ru/replace-array-with-object.md)

