# Principe de ségrégation des interfaces

En programmation orientée objet, le principe de ségrégation des interfaces (en anglais : Interface Segregation Principle ou ISP) stipule qu'aucun client ne devrait dépendre de méthodes qu'il n'utilise pas. Il faut donc diviser les interfaces volumineuses en plus petites plus spécifiques, de sorte que les clients n'ont accès qu'aux méthodes intéressantes pour eux. Ces interfaces rétrécies sont également appelées interfaces de rôle. Tout ceci est destiné à maintenir un système à couplage faible, donc plus facile à refactoriser.
Le principe de ségrégation des interfaces correspond au « I » de l'acronyme SOLID. Il est comparable à la cohésion des principes GRASP.

## Importance dans la conception orientée objet

Dans une conception orientée objet, les interfaces fournissent des couches d'abstraction qui facilitent l'explication du code, et créent une barrière empêchant le couplage à des dépendances.
Selon de nombreux experts en logiciel qui ont signé le Software craftsmanship, écrire un code compréhensible est presque aussi important qu'un code qui marche. Les interfaces décrivant les intentions du logiciel sont donc souvent une bonne idée.
Un système peut devenir tellement couplé à de multiples niveaux qu'il n'est plus possible de faire un changement dans un seul endroit, sans recourir à de nombreux autres. Une interface ou une classe abstraite peut éviter cet effet secondaire.

## Historique

Le principe de ségrégation des interfaces a d'abord été utilisé et formulé en 2002 par Robert C. Martin, consultant pour Xerox. L'entreprise avait créé un nouveau système d'imprimante qui pouvait effectuer une variété de tâches telles que l'agrafage et la télécopie. Le logiciel de ce système a été créé en approche ascendante. Puis le logiciel a grandi, imposant des modifications de plus en plus difficiles, de sorte que même le plus petit changement nécessitait un cycle de redéploiement d'une heure, ce qui rendait son développement presque impossible.
Le problème de conception était qu'une seule classe Job était utilisée par presque toutes les tâches. À chaque fois qu'une tâche d'impression ou qu'une tâche d'agrafage devait être effectuée, un appel à la classe Job été fait. Cela a entraîné une grosse classe avec une multitude de méthodes spécifiques pour toutes sortes de clients différents. En raison de cette conception, une tâche d’agrafage connaissait toutes les méthodes de la tâche d'impression bien qu'elle n'en eut aucune utilité.
La solution proposée par Martin utilisait ce que l'on appelle aujourd'hui le principe de ségrégation des interfaces. Appliqué au logiciel Xerox, une couche d'interface entre la classe et ses clients a été ajoutée à l'aide de l'inversion de dépendance. Au lieu d'avoir une grosse classe Job, une interface d’agrafage et une interface d'impression ont été créées, utilisant seulement certaines méthodes de la classe Job.

## Violation typique

Une violation typique du principe de ségrégation d'interface est donnée dans l'Agile Software Development: Principles, Patterns, and Practices, dans ATM Transaction example, et dans un article écrit par Robert C. Martin dédié au principe. Cet exemple décrit l'interface utilisateur d'un distributeur de billets, qui gère toutes les demandes telles qu'une demande de dépôt ou de retrait, et la façon dont cette interface doit être divisée en des interfaces plus spécifiques.