---
title: "Obsessão por Primitivos"
type: "code-smell"
slug: "primitive-obsession"
url: "http://localhost:3000/pt-br/smells/primitive-obsession.md"
category: "Bloaters"
description: "Uso de primitivos em vez de pequenos objetos para tarefas simples (como moeda, intervalos, strings especiais para números de telefone etc.)Uso de constantes para codificar informação (como uma constante USER_ADMIN_ROLE = 1 para se referir a usuários com direitos de administrador.)Uso de constantes de string como nomes de campos para uso em arrays de dados."
---
# Obsessão por Primitivos

> Uso de primitivos em vez de pequenos objetos para tarefas simples (como moeda, intervalos, strings especiais para números de telefone etc.)Uso de constantes para codificar informação (como uma constante USER_ADMIN_ROLE = 1 para se referir a usuários com direitos de administrador.)Uso de constantes de string como nomes de campos para uso em arrays de dados.

## Signs and Symptoms

* Uso de primitivos em vez de pequenos objetos para tarefas simples (como moeda, intervalos, strings especiais para números de telefone etc.)
* Uso de constantes para codificar informação (como uma constante `USER_ADMIN_ROLE = 1` para se referir a usuários com direitos de administrador.)
* Uso de constantes de string como nomes de campos para uso em arrays de dados.

## Reasons for the Problem

Como a maioria dos outros maus cheiros, as obsessões por primitivos nascem em momentos de fraqueza. “É só um campo para guardar alguns dados!”, disse o programador. Criar um campo primitivo é muito mais fácil do que fazer uma classe inteiramente nova, certo? E assim foi feito. Depois outro campo foi necessário e adicionado da mesma maneira. E eis que a classe ficou enorme e difícil de manejar.

Os primitivos costumam ser usados para “simular” tipos. Assim, em vez de um tipo de dado separado, você tem um conjunto de números ou strings que formam a lista de valores permitidos para alguma entidade. Em seguida, nomes fáceis de entender são dados a esses números e strings específicos por meio de constantes, e é por isso que eles se espalham por todo lado.

Outro exemplo de uso ruim de primitivos é a simulação de campos. A classe contém um grande array de dados variados, e constantes de string (que são especificadas na classe) são usadas como índices do array para obter esses dados.

## Payoff

* O código fica mais flexível graças ao uso de objetos em vez de primitivos.
* Melhor compreensão e organização do código. As operações sobre determinados dados ficam no mesmo lugar, em vez de espalhadas. Chega de adivinhar o motivo de todas essas constantes estranhas e por que elas estão em um array.
* Mais facilidade para encontrar código duplicado.
## Relations

**Treated by**

- [Substituir Valor de Dado por Objeto](/pt-br/replace-data-value-with-object.md)
- [Introduzir Objeto de Parâmetro](/pt-br/introduce-parameter-object.md)
- [Preservar o Objeto Inteiro](/pt-br/preserve-whole-object.md)
- [Substituir Código de Tipo por Classe](/pt-br/replace-type-code-with-class.md)
- [Substituir Código de Tipo por Subclasses](/pt-br/replace-type-code-with-subclasses.md)
- [Substituir Código de Tipo por Estado/Estratégia](/pt-br/replace-type-code-with-state-strategy.md)
- [Substituir Array por Objeto](/pt-br/replace-array-with-object.md)


## Detected by

- **sonar** `S109` — Magic numbers should not be used (https://rules.sonarsource.com/java/RSPEC-109/)
- **sonar** `S1192` — String literals should not be duplicated (https://rules.sonarsource.com/java/RSPEC-1192/)
- **eslint** `no-magic-numbers` — no-magic-numbers (ESLint core) (https://eslint.org/docs/latest/rules/no-magic-numbers)
- **eslint** `sonarjs/no-duplicate-string` — sonarjs/no-duplicate-string (https://github.com/SonarSource/eslint-plugin-sonarjs/blob/master/docs/rules/no-duplicate-string.md)
