---
title: "Pattern obsolète ou déprécié"
type: "ai-smell"
slug: "deprecated-pattern"
url: "http://localhost:3000/fr/ai-smells/deprecated-pattern.md"
category: "Maintenance"
description: "Les assistants IA produisent avec assurance des API, des bibliothèques et des idiomes qui étaient d'actualité il y a plusieurs années mais qui sont aujourd'hui dépréciés, supprimés ou remplacés, parce que leur connaissance paramétrique est figée à une date limite d'entraînement et que l'ancien pattern reste statistiquement le plus courant dans leur corpus."
---
# Pattern obsolète ou déprécié

> Les assistants IA produisent avec assurance des API, des bibliothèques et des idiomes qui étaient d'actualité il y a plusieurs années mais qui sont aujourd'hui dépréciés, supprimés ou remplacés, parce que leur connaissance paramétrique est figée à une date limite d'entraînement et que l'ancien pattern reste statistiquement le plus courant dans leur corpus.

## Signs and Symptoms

Un relecteur reconnaît ce smell lorsque le code généré _s'exécute_ mais correspond au style d'un tutoriel vieux de deux ou trois ans : il appelle des API que le framework signale désormais, épingle d'anciennes versions majeures, ou se rabat sur des idiomes hérités au lieu de la bibliothèque standard/syntaxe moderne. Signes révélateurs :

* **Avertissements de dépréciation à l'installation/build/exécution** que le modèle a ignorés (`DeprecationWarning`, `[DEP0005]`, `componentWillMount is deprecated`).
* **Idiomes antérieurs à la base actuelle du langage** : `var` au lieu de `const`/`let`, des chaînes de callbacks/`.then()` là où la base de code utilise `async/await`, `require()` dans un projet ESM, `moment.js` au lieu de `Intl`/`Temporal`/date-fns.
* **Appels de bibliothèque supprimés dans la version que vous avez réellement installée** : pandas `df.append(...)` / `.ix[]`, anciens cycles de vie React, `datetime.utcnow()`, Node `new Buffer()`, `url.parse()`.
* **Réglages de sécurité hérités** qui dominent les anciennes données d'entraînement : hachage MD5/SHA1, `crypto.createCipher`, SQL brut concaténé par chaînes.
* **Réinventer ce que la plateforme fournit désormais** (`deepClone`, `groupBy`, UUID faits main) au lieu de `structuredClone`, `Object.groupBy`, `crypto.randomUUID()`.

```js
// Généré par IA : compile, mais chaque ligne est désormais un pattern déprécié
const crypto = require('crypto');                 // le projet ESM utilise import

const buf = new Buffer(userInput);                // Buffer() déprécié depuis Node 6
const id  = crypto.createHash('md5')              // MD5 déprécié pour tout usage de sécurité
              .update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);  // API supprimée, KDF faible

request(apiUrl, (err, res, body) => { /* ... */ });      // 'request' non maintenu depuis 2020

```

## Reasons for the Problem

**Pourquoi les modèles le produisent**

* **Obsolescence liée à la date limite d'entraînement.** La connaissance paramétrique d'un LLM est figée à sa date limite, mais les bibliothèques continuent d'évoluer. Les études qui le mesurent constatent un **taux d'utilisation d'API dépréciées de 25–38 %** sur huit bibliothèques Python dans les complétions de LLM ([Wang et al., ICSE 2025](https://dl.acm.org/doi/10.1109/ICSE55347.2025.00245)), et même les modèles de pointe n'obtiennent que **48–51 %** en génération conditionnée par version ([GitChameleon 2.0](https://openreview.net/pdf?id=wtqdcVfJUN)). Il n'existe aucune connaissance en temps réel des API/versions au moment de l'inférence.
* **La fréquence du token suivant favorise l'ancienne méthode.** Le corpus contient des _années_ de code hérité, donc la complétion statistiquement la plus probable est souvent celle qui est obsolète. OX Security note que les modèles se rabattent par défaut sur la concaténation de chaînes et MD5/SHA1 précisément parce que ces approches « apparaissent le plus fréquemment dans les données d'entraînement », et Veracode a constaté que les modèles choisissent l'option non sécurisée/héritée **\~45 % du temps** lorsqu'on leur laisse le choix ([OX Security](https://www.ox.security/blog/vibe-coding-security/)).
* **Aucun contexte du dépôt.** Le modèle ignore généralement quelle version majeure vous avez réellement installée, ce que votre fichier de verrouillage épingle, ou que `lib/hash.ts` existe déjà — il ne peut donc pas viser _votre_ surface d'API. La formule de Stack Overflow : un agent est « un excellent reconnaisseur de patterns… du bon code en entrée, du bon code en sortie » — sans exemple actuel, il se rabat sur la moyenne de ses données d'entraînement ([Q&R avec Reyes](https://stackoverflow.blog/2026/02/04/code-smells-for-ai-agents-q-and-a-with-eno-reyes-of-factory/)).
* **Récompense « faire en sorte que ça marche » + complaisance.** Les modèles optimisent pour un code qui compile de manière plausible et satisfait le prompt, pas pour un code qui « emprunte le chemin actuel et pris en charge ». L'appel déprécié fonctionne _encore aujourd'hui_, il a donc l'air correct.

**Pourquoi c'est nuisible**

* **Maintenabilité / rupture à retardement.** Déprécié aujourd'hui signifie _supprimé dans la prochaine version majeure_ — le code fonctionne jusqu'à ce qu'une mise à niveau le casse silencieusement, et ces patterns sont copiés-collés plutôt que refactorisés. L'analyse de 211 M de lignes de GitClear montre que les lignes copiées-collées sont passées de **8,3 % à 12,3 %** tandis que les lignes refactorisées (« déplacées ») ont chuté de **24,1 % à 9,5 %** entre 2020 et 2024, avec des blocs dupliqués multipliés par \~8 — un seul idiome périmé se propage donc au lieu d'être corrigé une fois pour toutes ([GitClear 2025](https://www.gitclear.com/ai%5Fassistant%5Fcode%5Fquality%5F2025%5Fresearch)).
* **Exactitude.** Les API remplacées ont souvent une sémantique subtilement différente (`utcnow()` renvoie un datetime naïf ; les anciens cycles de vie se déclenchent à des moments différents), produisant des bugs qui passent un test de fumée rapide.
* **Sécurité.** La cryptographie dépréciée (MD5, `createCipher`) et les versions de paquets obsolètes portent des CVE connues que le modèle ne vérifie jamais contre une base de données d'avis de sécurité — un moteur central du constat selon lequel la _majorité_ du code généré par IA est livrée avec au moins une vulnérabilité.
* **Charge de revue & dette technique.** Chaque occurrence est une correction manuelle distincte, et parce que le pattern est dupliqué plutôt que centralisé, le coût s'accumule dans toute la base de code.

## Treatment

**Tactiques de revue & de prompting**

* **Indiquez les versions dans le prompt ou le contexte.** « Nous sommes sur React 19, pandas 2.2, Node 22 (ESM) — n'utilise que des API actuelles dans ces versions. » Tirez la documentation actuelle dans le contexte (un MCP de docs / Context7) au lieu de faire confiance à la mémoire paramétrique.
* **Imposez un passage par les outils.** Exigez que le modèle exécute le linter, le vérificateur de types et `npm outdated` / `pip list --outdated`, puis corrige chaque avertissement de dépréciation avant de se déclarer terminé. Les avertissements de dépréciation sont le détecteur le moins coûteux possible — ne les laissez pas être ignorés.
* **Exigez la réutilisation plutôt que la réinvention.** « Utilise le helper existant dans `lib/hash.ts` ; ne fabrique pas de hachage à la main. » Pointez vers le module canonique pour que le modèle ne régénère pas une version héritée (Code dupliqué).
* **Des codemods plutôt que des modifications manuelles.** Pour les mises à niveau systématiques, exécutez les codemods/modernizers officiels au lieu de demander au modèle de réécrire à la main : `npx @next/codemod`, les codemods React, les règles `pyupgrade`/Ruff `UP`. Ils sont déterministes et complets.

**Le refactoring** — il s'agit essentiellement de _Substituer un algorithme_ / remplacer-l'API-dépréciée, et consolider les appels périmés dupliqués en un seul helper applique _Extraire une fonction_ contre _Code dupliqué_ :

```js
// Avant — API dépréciées/sur des chemins supprimés
const buf    = new Buffer(userInput);
const id     = crypto.createHash('md5').update(token).digest('hex');
const cipher = crypto.createCipher('aes-256-cbc', key);

// Après — actuel, pris en charge, sain en matière de sécurité
import crypto from 'node:crypto';

const buf    = Buffer.from(userInput);                 // constructeur sûr
const id     = crypto.createHash('sha256').update(token).digest('hex');
const iv     = crypto.randomBytes(16);                 // IV explicite
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// (pour les mots de passe, utilisez argon2/bcrypt — pas un hachage brut)

```

Pour les dépendances, la correction équivalente consiste à relever l'épingle et à laisser le codemod migrer les sites d'appel, puis à verrouiller toute dérive future en CI (règle de lint ci-dessous + une politique Dependabot/Renovate) afin que le modèle ne puisse pas réintroduire silencieusement l'ancien pattern.

## Detected by

- **ESLint (eslint-plugin-n)** `n/no-deprecated-api` — Interdire les API de base Node.js dépréciées (Buffer(), crypto.createCipher, url.parse, etc.) (https://github.com/eslint-community/eslint-plugin-n/blob/master/docs/rules/no-deprecated-api.md)
- **typescript-eslint** `@typescript-eslint/no-deprecated` — Signaler l'usage de tout symbole marqué @deprecated dans sa déclaration JSDoc/TS (https://typescript-eslint.io/rules/no-deprecated/)
- **ESLint (eslint-plugin-react)** `react/no-deprecated` — Signaler les API et méthodes de cycle de vie React dépréciées (componentWillMount, etc.) (https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-deprecated.md)
- **SonarQube / SonarSource** `RSPEC-1874 ("@Deprecated" code should not be used)` — Signale l'utilisation de code annoté/marqué comme déprécié (https://rules.sonarsource.com/java/RSPEC-1874/)
- **Ruff** `pyupgrade (UP) rules` — Détecte et réécrit les idiomes Python obsolètes/remplacés vers leurs équivalents modernes (https://docs.astral.sh/ruff/rules/#pyupgrade-up)
- **Dependabot** `version-updates` — Signale les versions de dépendances obsolètes (la facette « paquet périmé » de ce smell) (https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates)
