---
title: "Remplacer un code de type par une classe"
type: "refactoring-technique"
slug: "replace-type-code-with-class"
url: "http://localhost:3000/fr/replace-type-code-with-class.md"
category: "Organizing Data"
description: "Problème : Une classe possède un champ qui contient un code de type. Les valeurs de ce type ne sont pas utilisées dans des conditions d'opérateur et n'affectent pas le comportement du programme. Solution : Créez une nouvelle classe et utilisez ses objets à la place des valeurs du code de type."
---
# Remplacer un code de type par une classe

> Problème : Une classe possède un champ qui contient un code de type. Les valeurs de ce type ne sont pas utilisées dans des conditions d'opérateur et n'affectent pas le comportement du programme. Solution : Créez une nouvelle classe et utilisez ses objets à la place des valeurs du code de type.

## Problem

Une classe possède un champ qui contient un code de type. Les valeurs de ce type ne sont pas utilisées dans des conditions d'opérateur et n'affectent pas le comportement du programme.

## Solution

Créez une nouvelle classe et utilisez ses objets à la place des valeurs du code de type.

## Why Refactor

L'une des raisons les plus courantes du recours à un code de type est le travail avec des bases de données, lorsqu'une base de données comporte des champs dans lesquels un concept complexe est codé par un nombre ou une chaîne.

Par exemple, vous avez la classe `User` avec le champ `user_role`, qui contient des informations sur les privilèges d'accès de chaque utilisateur, qu'il soit administrateur, éditeur ou utilisateur ordinaire. Dans ce cas, cette information est codée dans le champ par `A`, `E` et `U` respectivement.

Quels sont les inconvénients de cette approche ? Les setters du champ ne vérifient souvent pas quelle valeur est envoyée, ce qui peut causer de gros problèmes lorsque quelqu'un envoie des valeurs imprévues ou erronées à ces champs.

De plus, la vérification de type est impossible pour ces champs. Il est possible de leur envoyer n'importe quel nombre ou chaîne, qui ne sera pas vérifié en type par votre IDE et permettra même à votre programme de s'exécuter (et de planter plus tard).

## Benefits

* Nous voulons transformer des ensembles de valeurs primitives — ce que sont les types codés — en classes à part entière, avec tous les avantages qu'offre la programmation orientée objet.
* En remplaçant le code de type par des classes, nous permettons le typage des valeurs passées aux méthodes et aux champs au niveau du langage de programmation.
Par exemple, alors qu'auparavant le compilateur ne voyait aucune différence entre votre constante numérique et un nombre quelconque lorsqu'une valeur était passée à une méthode, désormais, lorsqu'une donnée qui ne correspond pas à la classe de type indiquée est passée, vous êtes averti de l'erreur dans votre IDE.
* Ainsi, nous rendons possible le déplacement du code vers les classes du type. Si vous aviez besoin d'effectuer des manipulations complexes avec les valeurs du type dans tout le programme, ce code peut désormais « vivre » à l'intérieur d'une ou plusieurs classes de type.

## How to Refactor

1. Créez une nouvelle classe et donnez-lui un nouveau nom qui correspond à la finalité du type codé. Nous l'appellerons ici _classe de type_.
2. Copiez le champ contenant le code de type dans la _classe de type_ et rendez-le privé. Créez ensuite un getter pour ce champ. Une valeur ne sera affectée à ce champ que depuis le constructeur.
3. Pour chaque valeur du type codé, créez une méthode statique dans la _classe de type_. Elle créera un nouvel objet de la _classe de type_ correspondant à cette valeur du type codé.
4. Dans la classe d'origine, remplacez le type du champ codé par la _classe de type_. Créez un nouvel objet de ce type dans le constructeur ainsi que dans le setter du champ. Modifiez le getter du champ pour qu'il appelle le getter de la _classe de type_.
5. Remplacez toute mention des valeurs du type codé par des appels aux méthodes statiques appropriées de la _classe de type_.
6. Supprimez les constantes du type codé de la classe d'origine.
## Relations

**Similar techniques**

- [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)

**Eliminates smells**

- [Obsession des types primitifs](/fr/smells/primitive-obsession.md)

