Interface
🛠️ Pourquoi l'ISP est-il important ?
| Avantage | Explication |
|---|---|
| Réduction des dépendances inutiles | Les classes n'implémentent que ce dont elles ont besoin. |
| Meilleure maintenabilité | Les interfaces sont claires et faciles à modifier. |
| Évitement des "fat interfaces" | Une interface trop large devient difficile à gérer et à étendre. |
⚡ Note : Des interfaces fines permettent de limiter les risques de couplage inutile et facilitent l’évolution du code.
🪄 Comment appliquer l'ISP ?
Pour respecter l'ISP :
- Décomposer les interfaces en plusieurs interfaces spécifiques.
- Éviter les interfaces "fourre-tout" qui regroupent trop de responsabilités.
- Privilégier la composition d'interfaces plutôt que l'héritage multiple.
ℹ️ Astuce : Chaque interface doit représenter une responsabilité unique et clairement définie.
📩 Exemple en C#
❌ Mauvaise pratique : Une interface trop large
public interface IWorker
{
void Work();
void Eat();
void Sleep();
}
public class HumanWorker : IWorker
{
public void Work() { /* ... */ }
public void Eat() { /* ... */ }
public void Sleep() { /* ... */ }
}
// Problème : Un robot n'a pas besoin de manger ou de dormir !
public class RobotWorker : IWorker
{
public void Work() { /* ... */ }
public void Eat() { throw new NotImplementedException(); }
public void Sleep() { throw new NotImplementedException(); }
}
ℹ️ Problème :
RobotWorkerest forcé d’implémenter des méthodes inutiles (Eat,Sleep), violant l'ISP.
✅ Bonne pratique : Interfaces segregées
public interface IWorkable
{
void Work();
}
public interface IEatable
{
void Eat();
}
public interface ISleepable
{
void Sleep();
}
// Une classe n'implémente que les interfaces nécessaires
public class HumanWorker : IWorkable, IEatable, ISleepable
{
public void Work() { /* ... */ }
public void Eat() { /* ... */ }
public void Sleep() { /* ... */ }
}
// Un robot n'implémente que ce qui est nécessaire
public class RobotWorker : IWorkable
{
public void Work() { /* ... */ }
}
ℹ️ Avantages :
- Chaque classe implémente uniquement les interfaces pertinentes.
- Code plus clair et facile à maintenir.
- Pas de méthodes inutiles ou jetées (
NotImplementedException).
⚡ Problèmes fréquents / Causes probables
| Symptôme | Cause probable | Solution |
|---|---|---|
| Classe forcée d’implémenter des méthodes inutiles | Interface trop large | Décomposer l’interface en interfaces plus petites |
| Difficulté à faire évoluer les interfaces | Trop de responsabilités dans une seule interface | Appliquer ISP et créer plusieurs interfaces spécifiques |
| Code peu clair et difficile à maintenir | Couplage inutile entre classes et méthodes | Privilégier la composition d’interfaces et implémenter uniquement ce qui est nécessaire |
🎯 Conclusion
Le Interface Segregation Principle permet de concevoir des interfaces fines, adaptées aux besoins réels des classes. En évitant les interfaces trop larges, le code devient plus robuste, plus flexible et plus facile à maintenir.