---
title: "Extraire une méthode"
type: "refactoring-technique"
slug: "extract-method"
url: "http://localhost:3000/fr/extract-method.md"
category: "Composing Methods"
description: "Problème : vous avez un fragment de code qui peut être regroupé. Solution : déplacez ce code dans une nouvelle méthode (ou fonction) distincte et remplacez l'ancien code par un appel à la méthode."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Extraire une méthode

> Problème : vous avez un fragment de code qui peut être regroupé. Solution : déplacez ce code dans une nouvelle méthode (ou fonction) distincte et remplacez l'ancien code par un appel à la méthode.

## Problem

Vous avez un fragment de code qui peut être regroupé.

## Solution

Déplacez ce code dans une nouvelle méthode (ou fonction) distincte et remplacez l'ancien code par un appel à la méthode.

## Why Refactor

Plus une méthode comporte de lignes, plus il est difficile de comprendre ce qu'elle fait. C'est la principale raison d'être de ce refactoring.

Outre l'élimination des aspérités de votre code, l'extraction de méthodes est aussi une étape de bien d'autres approches de refactoring.

## Benefits

* Un code plus lisible ! Veillez à donner à la nouvelle méthode un nom qui décrit son objectif : `createOrder()`, `renderCustomerInfo()`, etc.
* Moins de duplication de code. Souvent, le code contenu dans une méthode peut être réutilisé ailleurs dans votre programme. Vous pouvez donc remplacer les doublons par des appels à votre nouvelle méthode.
* Isole des parties indépendantes du code, ce qui rend les erreurs moins probables (par exemple si la mauvaise variable est modifiée).

## How to Refactor

1. Créez une nouvelle méthode et nommez-la de façon à rendre son objectif évident.
2. Copiez le fragment de code concerné dans votre nouvelle méthode. Supprimez le fragment de son ancien emplacement et placez-y à la place un appel à la nouvelle méthode.
Repérez toutes les variables utilisées dans ce fragment de code. Si elles sont déclarées à l'intérieur du fragment et ne sont pas utilisées en dehors, laissez-les simplement telles quelles — elles deviendront des variables locales de la nouvelle méthode.
3. Si les variables sont déclarées avant le code que vous extrayez, vous devrez passer ces variables aux paramètres de votre nouvelle méthode afin d'utiliser les valeurs qu'elles contenaient auparavant. Il est parfois plus simple de se débarrasser de ces variables en recourant à [Remplacer une variable temporaire par une requête](/fr/replace-temp-with-query).
4. Si vous constatez qu'une variable locale change d'une manière ou d'une autre dans le code extrait, cela peut signifier que cette valeur modifiée sera nécessaire plus tard dans votre méthode principale. Vérifiez-le ! Et si c'est bien le cas, renvoyez la valeur de cette variable à la méthode principale pour que tout continue de fonctionner.
## Relations

**Helps you do**

- [Introduire un objet paramètre](/fr/introduce-parameter-object.md)
- [Constituer une méthode patron](/fr/form-template-method.md)
- [Paramétrer la méthode](/fr/parameterize-method.md)

**Similar techniques**

- [Déplacer une méthode](/fr/move-method.md)

**Opposite refactorings**

- [Intégrer la méthode](/fr/inline-method.md)

**Eliminates smells**

- [Code dupliqué](/fr/smells/duplicate-code.md)
- [Méthode longue](/fr/smells/long-method.md)
- [Envie de fonctionnalité](/fr/smells/feature-envy.md)
- [Instructions switch](/fr/smells/switch-statements.md)
- [Chaînes de messages](/fr/smells/message-chains.md)
- [Commentaires](/fr/smells/comments.md)
- [Classe de données](/fr/smells/data-class.md)

## Code Examples

### java

```java
// Before
void printOwing() {
  printBanner();

  // Afficher les détails.
  System.out.println("name: " + name);
  System.out.println("amount: " + getOutstanding());
}

// After
void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails(double outstanding) {
  System.out.println("name: " + name);
  System.out.println("amount: " + outstanding);
}
```

### csharp

```csharp
// Before
void PrintOwing() 
{
  this.PrintBanner();

  // Afficher les détails.
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}

// After
void PrintOwing()
{
  this.PrintBanner();
  this.PrintDetails();
}

void PrintDetails()
{
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}
```

### php

```php
// Before
function printOwing() {
  $this->printBanner();

  // Afficher les détails.
  print("name:  " . $this->name);
  print("amount " . $this->getOutstanding());
}

// After
function printOwing() {
  $this->printBanner();
  $this->printDetails($this->getOutstanding());
}

function printDetails($outstanding) {
  print("name:  " . $this->name);
  print("amount " . $outstanding);
}
```

### python

```python
// Before
def printOwing(self):
    self.printBanner()

    # afficher les détails
    print("name:", self.name)
    print("amount:", self.getOutstanding())

// After
def printOwing(self):
    self.printBanner()
    self.printDetails(self.getOutstanding())

def printDetails(self, outstanding):
    print("name:", self.name)
    print("amount:", outstanding)
```

### typescript

```typescript
// Before
printOwing(): void {
  printBanner();

  // Afficher les détails.
  console.log("name: " + name);
  console.log("amount: " + getOutstanding());
}

// After
printOwing(): void {
  printBanner();
  printDetails(getOutstanding());
}

printDetails(outstanding: number): void {
  console.log("name: " + name);
  console.log("amount: " + outstanding);
}
```

