Réusinage de code legacy PHP : techniques et stratégies avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Réusinage de code legacy PHP : niveau avancé



Travailler avec du code obsolète (legacy) en PHP est une réalité inévitable pour de nombreux développeurs. Souvent, ce code est une application monolithique sans tests, avec des dépendances globales et un mélange de logique métier et de présentation. Un simple réusinage « à vue » peut entraîner des erreurs fatales. Dans cet article, nous examinerons des techniques avancées de réusinage qui vous permettront de moderniser les systèmes legacy de manière sûre et efficace.



1. Stratégie « Seam » : créer des points de rupture



La première étape du réusinage de code legacy est la création de coutures (seams). Une couture est un endroit où vous pouvez modifier le comportement du code sans le modifier directement. C'est particulièrement important lorsque le code n'est pas couvert par des tests et que vous ne pouvez pas l'exécuter en isolation.



Prenons un exemple classique : un accès direct à la base de données à l'intérieur d'une méthode.



<?php// Code legacyclass UserReport {    public function getActiveUsers() {        $db = new PDO('mysql:host=localhost;dbname=test', 'root', '');        $stmt = $db->query("SELECT * FROM users WHERE active = 1");        return $stmt->fetchAll();    }}?>


Problème : new PDO(...) crée une dépendance rigide. Pour tester cette méthode, vous avez besoin d'une vraie base de données.



Solution : injection de dépendance via le constructeur.



<?php// Réusinage : création d'une couture via DIclass UserReport {    private PDO $pdo;

public function __construct(PDO $pdo) { $this->pdo = $pdo; }

public function getActiveUsers(): array { $stmt = $this->pdo->query("SELECT * FROM users WHERE active = 1"); return $stmt->fetchAll(); }}

// Utilisation$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');$report = new UserReport($pdo);?>


Vous pouvez maintenant remplacer le PDO par un objet mock dans les tests. C'est une couture simple mais efficace.



2. Patron « Sprout Method » et « Sprout Class »



Lorsque vous ne pouvez pas modifier une méthode existante (par exemple, en raison de l'absence de tests), utilisez la stratégie « Sprout » : créez du nouveau code à côté de l'ancien, en basculant progressivement les appels.



Exemple : nous avons une méthode énorme qui valide et enregistre un utilisateur.



<?phpclass UserService {    public function saveUser(array $data): bool {        // 100 lignes de validation, journalisation et enregistrement        $email = $data['email'] ?? '';        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {            throw new InvalidArgumentException('Invalid email');        }        // ... beaucoup d'autre code        $db = new PDO(...);        $stmt = $db->prepare("INSERT INTO users ...");        // ...    }}?>


Au lieu de réusiner toute la méthode d'un coup, créez une nouvelle classe pour la validation.



<?phpclass UserValidator {    public function validate(array $data): void {        if (!filter_var($data['email'] ?? '', FILTER_VALIDATE_EMAIL)) {            throw new InvalidArgumentException('Invalid email');        }        // Ajoutez d'autres vérifications    }}

class UserService { private UserValidator $validator;

public function __construct(UserValidator $validator) { $this->validator = $validator; }

public function saveUser(array $data): bool { $this->validator->validate($data); // Le reste du code reste pour l'instant }}?>


Vous pouvez maintenant écrire des tests unitaires pour UserValidator sans toucher à l'ancien code. Progressivement, vous extrairez la logique de saveUser vers de nouvelles classes.



3. Élimination des états globaux et du code statique



Le code legacy utilise souvent des variables globales, des singletons et des méthodes statiques. Cela rend le code pratiquement impossible à

Blogs

Book Recommendations