---
title: "Extraire une classe"
type: "refactoring-technique"
slug: "extract-class"
url: "http://localhost:3000/fr/extract-class.md"
category: "Moving Features between Objects"
description: "Problème : lorsqu’une seule classe fait le travail de deux, cela devient malcommode. Solution : créez plutôt une nouvelle classe et placez-y les champs et les méthodes responsables de la fonctionnalité concernée."
---
# Extraire une classe

> Problème : lorsqu’une seule classe fait le travail de deux, cela devient malcommode. Solution : créez plutôt une nouvelle classe et placez-y les champs et les méthodes responsables de la fonctionnalité concernée.

## Problem

Lorsqu’une seule classe fait le travail de deux, cela devient malcommode.

## Solution

Créez plutôt une nouvelle classe et placez-y les champs et les méthodes responsables de la fonctionnalité concernée.

## Why Refactor

Les classes commencent toujours par être claires et faciles à comprendre. Elles font leur travail et s’occupent de leurs propres affaires, sans empiéter sur le travail des autres classes. Mais à mesure que le programme s’étend, on ajoute une méthode, puis un champ… et finalement, certaines classes assument bien plus de responsabilités qu’on ne l’avait jamais envisagé.

## Benefits

* Cette méthode de refactoring vous aidera à respecter le _principe de responsabilité unique_. Le code de vos classes sera plus évident et plus compréhensible.
* Les classes à responsabilité unique sont plus fiables et plus tolérantes aux changements. Par exemple, supposons que vous ayez une classe responsable de dix choses différentes. Lorsque vous modifiez cette classe pour l’améliorer sur un point, vous risquez de la casser pour les neuf autres.

## How to Refactor

Avant de commencer, décidez précisément de la manière dont vous voulez répartir les responsabilités de la classe.

1. Créez une nouvelle classe pour contenir la fonctionnalité concernée.
2. Établissez une relation entre l’ancienne classe et la nouvelle. Dans l’idéal, cette relation est unidirectionnelle ; cela permet de réutiliser la seconde classe sans aucun problème. Néanmoins, si vous estimez qu’une relation bidirectionnelle est nécessaire, elle peut toujours être mise en place.
3. Utilisez [Déplacer un champ](/fr/move-field) et [Déplacer une méthode](/fr/move-method) pour chaque champ et chaque méthode que vous avez décidé de déplacer vers la nouvelle classe. Pour les méthodes, commencez par les méthodes privées afin de réduire le risque de commettre un grand nombre d’erreurs. Essayez de ne déplacer qu’un peu à la fois et testez les résultats après chaque déplacement, afin d’éviter une accumulation de corrections d’erreurs à la toute fin.
Une fois les déplacements terminés, jetez un nouveau coup d’œil aux classes obtenues. Une ancienne classe dont les responsabilités ont changé peut être renommée pour plus de clarté. Vérifiez à nouveau si vous pouvez vous débarrasser des relations bidirectionnelles entre classes, s’il en existe.
4. Réfléchissez également à l’accessibilité de la nouvelle classe depuis l’extérieur. Vous pouvez masquer entièrement la classe au client en la rendant privée et en la gérant via les champs de l’ancienne classe. Vous pouvez aussi la rendre publique en autorisant le client à modifier directement les valeurs. Votre décision dépend ici du degré de sûreté pour le comportement de l’ancienne classe lorsque des modifications directes et inattendues sont apportées aux valeurs de la nouvelle classe.
## Relations

**Similar techniques**

- [Extraire une sous-classe](/fr/extract-subclass.md)
- [Remplacer une donnée par un objet](/fr/replace-data-value-with-object.md)

**Opposite refactorings**

- [Intégrer la classe](/fr/inline-class.md)

**Eliminates smells**

- [Code dupliqué](/fr/smells/duplicate-code.md)
- [Classe trop volumineuse](/fr/smells/large-class.md)
- [Modification divergente](/fr/smells/divergent-change.md)
- [Amas de données](/fr/smells/data-clumps.md)
- [Obsession des types primitifs](/fr/smells/primitive-obsession.md)
- [Champ temporaire](/fr/smells/temporary-field.md)
- [Intimité inappropriée](/fr/smells/inappropriate-intimacy.md)

