Conception : Quels sont les avantages de l'utilisation d'interfaces
En analyse orientée objet ?
Le 2009-10-05 21:41:55, par Blowdi, Membre à l'essai
Bonsoir à tous,
Je viens du monde C++ et j'ai récemment étudié d'autres langages qui utilisent la notion d'interface
J'ai tout d'abord compris cette notion comme étant un moyen de réunir plusieurs classes indépendantes (Ex : Homme et Felin)
On factorise un comportement commun par le biais d'une interface.
Cependant, j'observe souvent l'utilisation des interfaces comme une relation d'héritage "is-a". Or, pour cette relation, on utilise normalement naturellement l'héritage
Au delà de la factorisation des comportements et de l'obligation d'adherer au contrat lorsqu'on implémente une interface, quels sont les autres utilités de l'interface
Je poste dans cette catégorie en considérant que cette question est proche des "best practices"
Merci d'avance pour vos informations
Je viens du monde C++ et j'ai récemment étudié d'autres langages qui utilisent la notion d'interface
J'ai tout d'abord compris cette notion comme étant un moyen de réunir plusieurs classes indépendantes (Ex : Homme et Felin)
On factorise un comportement commun par le biais d'une interface.
Cependant, j'observe souvent l'utilisation des interfaces comme une relation d'héritage "is-a". Or, pour cette relation, on utilise normalement naturellement l'héritage
Au delà de la factorisation des comportements et de l'obligation d'adherer au contrat lorsqu'on implémente une interface, quels sont les autres utilités de l'interface
Je poste dans cette catégorie en considérant que cette question est proche des "best practices"
Merci d'avance pour vos informations
-
wiztricksExpert éminent séniorBonsoir,J'ai tout d'abord compris cette notion comme étant un moyen de réunir plusieurs classes indépendantes (Ex : Homme et Felin)
On factorise un comportement commun par le biais d'une interface.Cependant, j'observe souvent l'utilisation des interfaces comme une relation d'héritage "is-a". Or, pour cette relation, on utilise normalement naturellement l'héritage
-Wle 06/10/2009 à 21:19 -
TheLeadingEdgeMembre expertcela est sans doute spécifique à Java qui ne permet pas (comme C++ par exemple) des héritages multiples et pour lequel le concept d'interface peut être utilisé pour pallier cela.le 06/10/2009 à 21:50
-
blbirdMembre chevronnéExactement, d'où le terme d'interface - de communication. CQFD.
C'est pour moi le principal intérêt.le 06/10/2009 à 23:12 -
pip1000Membre régulierJe pense qu'il faut plutôt voir une interface comme is-ableof, elle définit l'enveloppe de tes futures implémentations en définissants des comportements.
Par exemple si tu as des objets qui vont se dessiner dans une application tu vas définir une interface Drawable avec une méthode draw. L'utilisateur de Drawable n'a pas besoin d'en connaitre plus, les producteurs de Drawable eux seul connaitront la ou les implémentations. Et éventuellement dans le but de factoriser du code pourront avoir une notion d'héritage pour les objets circulaires par exemple. Si cette notion de circularité interesse quelqu'un d'autre que le producteur? -> INTERFACE!
En phase de conception pour etre extreme tu ne vas définir que des interfaces sauf pour des objets qui representent de la donnée pure (des objets avec des attibuts et des getters/setters aussi appelés java bean mais ne font aucun traitement).
Enfin l'avantage d'utiliser des interfaces va etre la capacité que tu auras de remplacer les implémentations finales par des implementations de tests ou "bouchons" pour tester une partie de ton application sans qu'une autre partie dont elle dépend (par l'interface) n'éxiste encore.
Enfin une remarque non argumentée mais totalement empirique provenant de mon expérience de JAVA: L'héritage n'est à utiliser qu'en cas d'extrême urgence!! ;-)
Ayant fait un tout petit peu d'Objective-C j'ai trouvé très interessant le principe de dire: Toute instance doit avoir son interface associée et personne ne voit l'implementation mais l'interface.le 07/10/2009 à 8:32 -
adiGubaExpert éminent séniorSalut,
Je rajouterais juste une remarque : les interfaces et la notion d'abstraction complète de l'implémentation permettent d'éviter les problèmes de l'héritage en losange.
Car une des grosses différences dans l'approche "orienté objet" de Java par rapport à C++ vient du fait que toutes les méthodes sont virtuelles par défaut, ce qui amplifie le risque de conflit lié à l'héritage multiple.
a++le 07/10/2009 à 9:09 -
BlowdiMembre à l'essaiJe pense qu'il faut plutôt voir une interface comme is-ableof, elle définit l'enveloppe de tes futures implémentations en définissants des comportements.
Exemple : Une classe de connexion à une base de données est "Debugable" (implémente l'interface Debug) et une classe d'affichage d'images est aussi "Debugable". Les deux classes peuvent êtres traitées indifféremment par le biais de cette interfaceMais une interface peut aussi être utilisée pour remplacer l'héritage par la composition (''HAS-A'' plutôt que ''IS-A'') pour spécialiser un objet. Ce qui permet de réduire fortement le couplage entre les classes.
Arrêtez moi si je me trompe ;-)le 07/10/2009 à 10:39 -
mister3957Membre expérimentéTa question revient à "A quoi sert le polymorphisme"
Fait des recherches là dessus
Attention : Il y a plusieurs types de polymorphisme, le dynamique (avec des interfaces ou des classes abstraites) et le statique (avec les templates, les classes politiques etc.)le 07/10/2009 à 12:00 -
TheLeadingEdgeMembre expertArrêtez moi si je me trompe ;-)
Le DP Strategie est un bon exemple d'utilisation de l'interface en OOA.
même si pour moi il reste plutôt proche de l'héritage (sans certaines de ses contraintes).le 07/10/2009 à 12:31 -
TheNOHDirectorMembre du ClubJ'ajouterais que pendant un bon moment en Java notamment, on utilisait énormément d'interfaces (pour une classe java, il y a une interface (au moins)). Aujourd'hui la tendance est plutôt de revenir en arrière et de n'utiliser les interface quand cela s'avère nécessaire (et là c'est du design):
on veut séparer les contrats pour une seule implémentation
on veut avoir plusieurs implémentations
on ne veut exposer qu'une partie des contrats au code client
on veut livrer un jar d'API à un client externe
...
Bref l'idée est de ne pas mettre une interface quand il n'y a pas de raison d'en mettre, si jamais il y en a besoin alors il faudra faire un refactoring. Ce n'est pas gênant parce que le besoin évolue donc le code sera à modifier de toute façon.le 07/10/2009 à 14:32 -
wiztricksExpert éminent séniorJ'ai l'impression que la discussion mélange deux domaines assez différents que sont:
- les patterns de collaboration entre objets dans lesquels les glues facade, adapter, wrapper, strategy proposent des variantes à adapter à son cas particulier
- interface offerte par un composant style l'API d'une DLL (pour sortir de l'interface Java qui est assez particulière).
L'interface est proche de la façade: les choses se passent derrière l'API et son client n'a pas à se soucier de l'implémentation. Mieux, on peut changer le composant et pourvu que l'API soit respectée, le client est servi de la même façon (en principe).
Tout çà pour dire que 'interface' comme porte pour communiquer avec un composant (quelqu'il soit) n'a pas grand chose a voir à priori avec la construction de liens entre objets (qui traite de la construction du composant).
-Wle 07/10/2009 à 20:18