📝 Ce que vous apprendrez

  • Ce que signifie le principe d'ouverture/fermeture
  • Comment l'appliquer dans votre code
  • Exemples concrets
  • Ce qui ne va pas lorsque l'OCP est ignoré

📖 Qu'est-ce que le principe d'ouverture/fermeture ?

Le principe d'ouverture/fermeture est le suivant :

**Les entités logicielles (classes, modules, fonctions) doivent être ouvertes à l'extension, mais fermées à la modification.

En bref : Vous devriez pouvoir ajouter un nouveau comportement sans modifier le code existant.

🧱 Application de l'OCP dans le code

Prenons un exemple qui enfreint le principe :

❌ Violation de l'OCP

public class NotificationService {
    public void send(String type) {
        if (type.equals("email")) {
            // send email
        } else if (type.equals("sms")) {
            // send SMS
        }
    }
}

Chaque fois qu'un nouveau type de notification est ajouté, vous devez éditer cette classe, ce qui est contraire à l'OCP.

✅ Conception conforme à l'OCP

Utilisez le polymorphisme et l'abstraction pour étendre sans modifier :

public interface Notification {
    void send();
}

public class EmailNotification implements Notification {
    public void send() {
        // send email
    }
}

public class SMSNotification implements Notification {
    public void send() {
        // send SMS
    }
}

public class NotificationService {
    public void notifyUser(Notification notification) {
        notification.send();
    }
}

Vous pouvez maintenant ajouter de nouveaux types (comme PushNotification) sans toucher au code existant.

🧪 Exemple du monde réel

Imaginez un système de remise :

Mauvaise conception:

class Discount {
    double calculate(String type) {
        if (type.equals("student")) return 0.9;
        if (type.equals("vip")) return 0.8;
        return 1.0;
    }
}

Mieux avec OCP:

interface Discount {
    double apply(double price);
}

class StudentDiscount implements Discount {
    public double apply(double price) {
        return price * 0.9;
    }
}

class VIPDiscount implements Discount {
    public double apply(double price) {
        return price * 0.8;
    }
}

⚠️ Risques de violation de l'OCP

  • Plus de bugs avec chaque nouvelle fonctionnalité
  • Faible évolutivité
  • Difficile à tester et à entretenir
  • Risque élevé de rupture des fonctionnalités existantes

📘 Recap

  • L'OCP favorise l'extension plutôt que la modification
  • Ajouter de nouvelles fonctionnalités en écrivant du nouveau code, et non en réécrivant l'ancien.
  • Utiliser les interfaces et l'héritage pour plus de flexibilité