Aller au contenu principal

Interface

🛠️ Pourquoi l'ISP est-il important ?

AvantageExplication
Réduction des dépendances inutilesLes 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 :

  1. Décomposer les interfaces en plusieurs interfaces spécifiques.
  2. Éviter les interfaces "fourre-tout" qui regroupent trop de responsabilités.
  3. 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 : RobotWorker est 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ômeCause probableSolution
Classe forcée d’implémenter des méthodes inutilesInterface trop largeDécomposer l’interface en interfaces plus petites
Difficulté à faire évoluer les interfacesTrop de responsabilités dans une seule interfaceAppliquer ISP et créer plusieurs interfaces spécifiques
Code peu clair et difficile à maintenirCouplage inutile entre classes et méthodesPrivilé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.