Une interface logicielle peut désigner un large éventail de différents types d’interface à différents « niveaux » : un système d’exploitation peut s’interfacer avec des éléments matériels. Les applications ou programmes exécutés sur le système d’exploitation peuvent avoir besoin d’interagir via des flux de données, des filtres et des pipelines ; et dans les programmes orientés objet, les objets d’une application peuvent avoir besoin d’interagir via des méthodes.
En pratiqueEdit
Un principe clé de la conception consiste à interdire l’accès à toutes les ressources par défaut, en n’autorisant l’accès qu’à travers des points d’entrée bien définis, c’est-à-dire des interfaces. Les interfaces logicielles permettent d’accéder aux ressources informatiques (telles que la mémoire, le processeur, le stockage, etc.) du système informatique sous-jacent; l’accès direct (c’est-à—dire non par des interfaces bien conçues) à ces ressources par des logiciels peut avoir des ramifications majeures — parfois désastreuses – pour la fonctionnalité et la stabilité.
Les interfaces entre les composants logiciels peuvent fournir des constantes, des types de données, des types de procédures, des spécifications d’exception et des signatures de méthodes. Parfois, les variables publiques sont également définies dans le cadre d’une interface.
L’interface d’un module logiciel A est délibérément définie séparément de l’implémentation de ce module. Ce dernier contient le code réel des procédures et méthodes décrites dans l’interface, ainsi que d’autres variables « privées », procédures, etc. Un autre module logiciel B, par example le client de A, qui interagit avec A est obligé de le faire uniquement via l’interface publiée. Un avantage pratique de cette disposition est que le remplacement de l’implémentation de A par une autre implémentation de la même interface ne devrait pas entraîner l’échec de B — la façon dont A répond en interne aux exigences de l’interface n’est pas pertinente pour B, qui ne concerne que les spécifications de l’interface. (Voir aussi le principe de substitution de Liskov.)
En langage orienté objetmodiFier
Dans certains langages orientés objet, en particulier ceux sans héritage multiple complet, le terme interface est utilisé pour définir un type abstrait qui ne contient aucune donnée mais définit les comportements comme des signatures de méthode. Une classe ayant du code et des données pour toutes les méthodes correspondant à cette interface et déclarant ainsi est dite implémenter cette interface. De plus, même dans les langages à héritage unique, on peut implémenter plusieurs interfaces, et donc être de différents types en même temps.
Une interface est donc une définition de type ; partout où un objet peut être échangé (par exemple, dans un appel de fonction ou de méthode), le type de l’objet à échanger peut être défini en termes d’une de ses interfaces implémentées ou de classes de base plutôt que de spécifier la classe spécifique. Cette approche signifie que toute classe qui implémente cette interface peut être utilisée. Par exemple, une implémentation fictive peut être utilisée pour permettre au développement de progresser avant que l’implémentation finale ne soit disponible. Dans un autre cas, une implémentation fausse ou fictive peut être substituée lors des tests. De telles implémentations de stub sont remplacées par du code réel plus tard dans le processus de développement.
Habituellement, une méthode définie dans une interface ne contient aucun code et ne peut donc pas être elle-même appelée ; elle doit être implémentée par du code non abstrait pour être exécutée lorsqu’elle est invoquée. Une interface appelée « Stack
» peut définir deux méthodes : push()
et pop()
. Il peut être implémenté de différentes manières, par exemple, FastStack
et GenericStack
— le premier étant rapide, travaillant avec une structure de données de taille fixe, et le second utilisant une structure de données qui peut être redimensionnée, mais au prix d’une vitesse un peu inférieure.
Bien que les interfaces puissent contenir de nombreuses méthodes, elles peuvent n’en contenir qu’une ou même aucune. Par exemple, le langage Java définit l’interface Readable
qui a la seule méthode read()
; diverses implémentations sont utilisées à des fins différentes, y compris BufferedReader
FileReader
InputStreamReader
PipedReader
, et StringReader
. Les interfaces de marqueurs comme Serializable
ne contiennent aucune méthode et servent à fournir des informations d’exécution au traitement générique en utilisant la réflexion.
Programmation sur l’interfaceEdit
L’utilisation d’interfaces permet un style de programmation appelé programmation sur l’interface. L’idée derrière cette approche est de baser la logique de programmation sur les interfaces des objets utilisés, plutôt que sur des détails d’implémentation internes. La programmation sur l’interface réduit la dépendance aux spécificités d’implémentation et rend le code plus réutilisable.
Poussant cette idée à l’extrême, l’inversion de contrôle quitte le contexte pour injecter le code avec les implémentations spécifiques de l’interface qui seront utilisées pour effectuer le travail.