📝 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é