---
title: "Obsession des types primitifs"
type: "code-smell"
slug: "primitive-obsession"
url: "http://localhost:3000/fr/smells/primitive-obsession.md"
category: "Bloaters"
description: "Utilisation de primitifs au lieu de petits objets pour des tâches simples (comme les montants monétaires, les plages de valeurs, les chaînes spéciales pour les numéros de téléphone, etc.) Utilisation de constantes pour encoder des informations (comme une constante USER_ADMIN_ROLE = 1 pour désigner les utilisateurs disposant de droits d'administrateur.) Utilisation de constantes de type chaîne comme noms de champs pour les tableaux de données."
---
# Obsession des types primitifs

> Utilisation de primitifs au lieu de petits objets pour des tâches simples (comme les montants monétaires, les plages de valeurs, les chaînes spéciales pour les numéros de téléphone, etc.) Utilisation de constantes pour encoder des informations (comme une constante USER_ADMIN_ROLE = 1 pour désigner les utilisateurs disposant de droits d'administrateur.) Utilisation de constantes de type chaîne comme noms de champs pour les tableaux de données.

## Signs and Symptoms

* Utilisation de primitifs au lieu de petits objets pour des tâches simples (comme les montants monétaires, les plages de valeurs, les chaînes spéciales pour les numéros de téléphone, etc.)
* Utilisation de constantes pour encoder des informations (comme une constante `USER_ADMIN_ROLE = 1` pour désigner les utilisateurs disposant de droits d'administrateur.)
* Utilisation de constantes de type chaîne comme noms de champs pour les tableaux de données.

## Reasons for the Problem

Comme la plupart des autres odeurs, l'obsession des primitifs naît dans des moments de faiblesse. « Juste un champ pour stocker quelques données ! » s'est dit le programmeur. Créer un champ primitif est tellement plus facile que de créer une toute nouvelle classe, n'est-ce pas ? Et c'est ainsi que cela s'est fait. Puis un autre champ a été nécessaire et a été ajouté de la même manière. Et voilà que la classe est devenue énorme et difficile à manier.

Les primitifs sont souvent utilisés pour « simuler » des types. Ainsi, au lieu d'un type de données distinct, vous avez un ensemble de nombres ou de chaînes qui forment la liste des valeurs autorisées pour une certaine entité. Des noms faciles à comprendre sont ensuite donnés à ces nombres et chaînes spécifiques au moyen de constantes, c'est pourquoi ils se répandent largement.

Un autre exemple de mauvaise utilisation des primitifs est la simulation de champs. La classe contient un grand tableau de données diverses et des constantes de type chaîne (qui sont définies dans la classe) sont utilisées comme indices du tableau pour récupérer ces données.

## Payoff

* Le code devient plus flexible grâce à l'utilisation d'objets au lieu de primitifs.
* Meilleure compréhension et organisation du code. Les opérations sur des données particulières sont regroupées au même endroit, au lieu d'être éparpillées. Plus besoin de deviner la raison de toutes ces constantes étranges ni pourquoi elles se trouvent dans un tableau.
* Repérage plus facile du code dupliqué.
## Relations

**Treated by**

- [Remplacer une donnée par un objet](/fr/replace-data-value-with-object.md)
- [Introduire un objet paramètre](/fr/introduce-parameter-object.md)
- [Préserver l'objet entier](/fr/preserve-whole-object.md)
- [Remplacer un code de type par une classe](/fr/replace-type-code-with-class.md)
- [Remplacer un code type par des sous-classes](/fr/replace-type-code-with-subclasses.md)
- [Remplacer le code de type par State/Strategy](/fr/replace-type-code-with-state-strategy.md)
- [Remplacer un tableau par un objet](/fr/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)
