---
title: "Introduire une assertion"
type: "refactoring-technique"
slug: "introduce-assertion"
url: "http://localhost:3000/fr/introduce-assertion.md"
category: "Simplifying Conditional Expressions"
description: "Problème : pour qu'une portion de code fonctionne correctement, certaines conditions ou valeurs doivent être vraies. Solution : remplacez ces hypothèses par des vérifications d'assertion explicites."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Introduire une assertion

> Problème : pour qu'une portion de code fonctionne correctement, certaines conditions ou valeurs doivent être vraies. Solution : remplacez ces hypothèses par des vérifications d'assertion explicites.

## Problem

Pour qu'une portion de code fonctionne correctement, certaines conditions ou valeurs doivent être vraies.

## Solution

Remplacez ces hypothèses par des vérifications d'assertion explicites.

## Why Refactor

Supposons qu'une portion de code fasse une hypothèse, par exemple, sur l'état actuel d'un objet ou sur la valeur d'un paramètre ou d'une variable locale. Habituellement, cette hypothèse sera toujours vraie, sauf en cas d'erreur.

Rendez ces hypothèses explicites en ajoutant les assertions correspondantes. Comme pour le typage des paramètres de méthode, ces assertions peuvent servir de documentation vivante pour votre code.

Pour repérer où votre code a besoin d'assertions, recherchez les commentaires qui décrivent les conditions dans lesquelles une méthode donnée fonctionnera.

## Benefits

* Si une hypothèse est fausse et que le code produit donc un résultat erroné, mieux vaut arrêter l'exécution avant que cela n'entraîne des conséquences fatales et une corruption des données. Cela signifie aussi que vous avez omis d'écrire un test nécessaire lorsque vous avez conçu les modalités de test du programme.

## How to Refactor

Lorsque vous constatez qu'une condition est supposée vraie, ajoutez une assertion pour cette condition afin de vous en assurer.

L'ajout de l'assertion ne devrait pas modifier le comportement du programme.

N'abusez pas des assertions pour **tout** dans votre code. Ne vérifiez que les conditions nécessaires au bon fonctionnement du code. Si votre code fonctionne normalement même lorsqu'une assertion donnée est fausse, vous pouvez la supprimer sans risque.
## Relations

**Eliminates smells**

- [Commentaires](/fr/smells/comments.md)

## Code Examples

### java

```java
// Before
double getExpenseLimit() {
  // Devrait avoir soit une limite de dépenses,
  // soit un projet principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.getMemberExpenseLimit();
}

// After
double getExpenseLimit() {
  Assert.isTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

### csharp

```csharp
// Before
double GetExpenseLimit() 
{
  // Devrait avoir soit une limite de dépenses,
  // soit un projet principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.GetMemberExpenseLimit();
}

// After
double GetExpenseLimit() 
{
  Assert.IsTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.GetMemberExpenseLimit();
}
```

### php

```php
// Before
function getExpenseLimit() {
  // Devrait avoir soit une limite de dépenses,
  // soit un projet principal.
  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}

// After
function getExpenseLimit() {
  assert($this->expenseLimit !== NULL_EXPENSE || isset($this->primaryProject));

  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}
```

### python

```python
// Before
def getExpenseLimit(self):
    # Devrait avoir soit une limite de dépenses,
    # soit un projet principal.
    return self.expenseLimit if self.expenseLimit != NULL_EXPENSE else \
        self.primaryProject.getMemberExpenseLimit()

// After
def getExpenseLimit(self):
    assert (self.expenseLimit != NULL_EXPENSE) or (self.primaryProject != None)

    return self.expenseLimit if (self.expenseLimit != NULL_EXPENSE) else \
        self.primaryProject.getMemberExpenseLimit()
```

### typescript

```typescript
// Before
getExpenseLimit(): number {
  // Devrait avoir soit une limite de dépenses,
  // soit un projet principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}

// After
getExpenseLimit(): number {
  // TypeScript et JS n'ont pas d'assertions intégrées, nous utiliserons donc
  // le bon vieux console.error(). Vous pouvez toujours l'extraire dans une
  // fonction d'assertion dédiée.
  if (!(expenseLimit != NULL_EXPENSE ||
       (typeof primaryProject !== 'undefined' && primaryProject))) {
      console.error("Assertion failed: getExpenseLimit()");
  }

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

