---
title: "Remplacer le code de type par State/Strategy"
type: "refactoring-technique"
slug: "replace-type-code-with-state-strategy"
url: "http://localhost:3000/fr/replace-type-code-with-state-strategy.md"
category: "Organizing Data"
description: "Problème : vous avez un type codé qui influe sur le comportement mais vous ne pouvez pas recourir à des sous-classes pour vous en débarrasser. Solution : remplacez le code de type par un objet d'état. S'il faut remplacer la valeur d'un champ contenant le code de type, un autre objet d'état est « branché » à la place."
---
# Remplacer le code de type par State/Strategy

> Problème : vous avez un type codé qui influe sur le comportement mais vous ne pouvez pas recourir à des sous-classes pour vous en débarrasser. Solution : remplacez le code de type par un objet d'état. S'il faut remplacer la valeur d'un champ contenant le code de type, un autre objet d'état est « branché » à la place.

## Problem

Vous avez un type codé qui influe sur le comportement mais vous ne pouvez pas recourir à des sous-classes pour vous en débarrasser.

## Solution

Remplacez le code de type par un objet d'état. S'il faut remplacer la valeur d'un champ contenant le code de type, un autre objet d'état est « branché » à la place.

## Why Refactor

Vous avez un code de type et il influe sur le comportement d'une classe, c'est pourquoi nous ne pouvons pas utiliser [Remplacer le code de type par une classe](/fr/replace-type-code-with-class).

Le code de type influe sur le comportement d'une classe mais nous ne pouvons pas créer de sous-classes pour le type codé en raison de la hiérarchie de classes existante ou pour d'autres raisons. Cela signifie que nous ne pouvons pas appliquer [Remplacer le code de type par des sous-classes](/fr/replace-type-code-with-subclasses).

## Benefits

* Cette technique de refactoring est une issue lorsqu'un champ contenant un type codé change de valeur au cours de la vie de l'objet. Dans ce cas, le remplacement de la valeur se fait via le remplacement de l'objet d'état auquel la classe d'origine fait référence.
* Si vous devez ajouter une nouvelle valeur d'un type codé, il vous suffit d'ajouter une nouvelle sous-classe d'état sans modifier le code existant (cf. le _principe ouvert/fermé_).

## How to Refactor

1. Utilisez [Auto-encapsuler un champ](/fr/self-encapsulate-field) pour créer un accesseur (getter) du champ qui contient le code de type.
2. Créez une nouvelle classe et donnez-lui un nom compréhensible qui correspond à la finalité du code de type. Cette classe jouera le rôle d'_état_ (ou de _stratégie_). À l'intérieur, créez un accesseur abstrait du champ codé.
3. Créez des sous-classes de la classe d'état pour chaque valeur du type codé. Dans chaque sous-classe, redéfinissez l'accesseur du champ codé de sorte qu'il renvoie la valeur correspondante du type codé.
4. Dans la classe d'état abstraite, créez une méthode de fabrique statique qui accepte la valeur du type codé en paramètre. Selon ce paramètre, la méthode de fabrique créera des objets d'états variés. Pour cela, créez dans son code un grand conditionnel ; ce sera le seul une fois le refactoring terminé.
5. Dans la classe d'origine, changez le type du champ codé pour la classe d'état. Dans le mutateur (setter) du champ, appelez la méthode de fabrique d'état pour obtenir de nouveaux objets d'état.
6. Vous pouvez maintenant commencer à déplacer les champs et les méthodes de la superclasse vers les sous-classes d'état correspondantes (à l'aide de [Descendre un champ](/fr/push-down-field) et [Descendre une méthode](/fr/push-down-method)).
7. Une fois tout ce qui est déplaçable déplacé, utilisez [Remplacer un conditionnel par le polymorphisme](/fr/replace-conditional-with-polymorphism) afin de vous débarrasser définitivement des conditionnels qui utilisent le code de type.
## Relations

**Similar techniques**

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

**Eliminates smells**

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

