Conception : Quels sont les avantages de l'utilisation d'interfaces
En analyse orientée objet ?

Le , 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


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de mister3957 mister3957 - Membre éprouvé https://www.developpez.com
le 07/10/2009 à 12:00
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.)
Avatar de TheLeadingEdge TheLeadingEdge - Membre expert https://www.developpez.com
le 07/10/2009 à 12:31
Arrêtez moi si je me trompe ;-)

Non, non. C'est bon. Mais je pensais plutôt à la délégation, une classe ''à la capacité de'' (is able of comme l'a dit qqu'un ci-dessus) ou au décorateur.
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).
Avatar de TheNOHDirector TheNOHDirector - Membre du Club https://www.developpez.com
le 07/10/2009 à 14:32
J'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.
Avatar de wiztricks wiztricks - Modérateur https://www.developpez.com
le 07/10/2009 à 20:18
J'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).
-W
Avatar de wiztricks wiztricks - Modérateur https://www.developpez.com
le 07/10/2009 à 20:30
Citation Envoyé par TheLeadingEdge  Voir le message
+1 pour l'héritage multiple. Mais 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.

Honnêtement, je ne connais pas de pattern de structuration qui s'appelle 'interface pattern'... Or le but de ces patterns est justement de réduire le couplage induit par l'héritage.

Et dans le fil de la discussion, on voit bien que 'interface' se rapporte à un ensemble de pattern de structuration...
Certes, on va pouvoir mettre des interface dans la plupart de ces patterns écrits en Java... Mais n'est-ce pas spécifique a une mise en œuvre Java?
- W
Avatar de TheLeadingEdge TheLeadingEdge - Membre expert https://www.developpez.com
le 07/10/2009 à 22:07
Honnêtement, je ne connais pas de pattern de structuration qui s'appelle 'interface pattern'...
Or le but de ces patterns est justement de réduire le couplage induit par l'héritage.
Et dans le fil de la discussion, on voit bien que 'interface' se rapporte à un ensemble de pattern de structuration...

Si on parle bien de la même chose, E. Gamma à classé Décorateur dans les patterns structurels.
Mais Stratégie est un pattern comportemental (tjours selon Gamma).
Je pense que les DP peuvent servir d'exemples ponctuellement, mais que circonscrire le concept d'interface à un ou plusieurs patterns est une fausse piste. C'est un concept beaucoup plus général.

Certes, on va pouvoir mettre des interface dans la plupart de ces patterns écrits en Java...
Mais n'est-ce pas spécifique a une mise en œuvre Java?

J'avoue pour Java. Et aussi que je suis vraiment rouillé en C+. Mais on peut remplacer interface (java) par classe abstraite (c++) ?
C'est toujours le même concept ''développer pour une interface, pas pour une implémentation''.
Avatar de ejerbi ejerbi - Futur Membre du Club https://www.developpez.com
le 07/10/2009 à 22:28
Citation Envoyé par TheLeadingEdge  Voir le message

C'est toujours le même concept ''développer pour une interface, pas pour une implémentation''.

Oui, déjà il est conseillé de mettre toujours le nom de l'interface à gauche puis reste à voir comment on va instancier l'objet (designs patterns créationnels comme l'AbstractFactory, instancier directement l'objet....)
Avatar de 3DArchi 3DArchi - Rédacteur https://www.developpez.com
le 08/10/2009 à 13:01
Bonjour,
De prime abord, j'aurais tendance à définir une interface en C++ comme une classe abstraite cad dont toutes les fonctions sont virtuelles pures. C'est une relation IS-A dans le sens où la classe concrète met en œuvre l'interface définie.
A quoi ça sert ? Ben à abstraire le contrat définit par l'interface des détails d'implémentation proposés par la classe concrète.
Avatar de wiztricks wiztricks - Modérateur https://www.developpez.com
le 08/10/2009 à 21:04
Citation Envoyé par TheLeadingEdge  Voir le message
J'avoue pour Java. Et aussi que je suis vraiment rouillé en C+. Mais on peut remplacer interface (java) par classe abstraite (c++) ?
C'est toujours le même concept ''développer pour une interface, pas pour une implémentation''.

Cela ne revient-il pas à comparer une "feature" Java avec sa réalisation en C++? Quel est le Design Pattern associé a cette 'feature' ?
-W
Avatar de graminou graminou - Nouveau membre du Club https://www.developpez.com
le 05/11/2009 à 10:21
Bonjour, et tout d'abord merci pour cette discussion qui m'éclaire sur l'utilité des interfaces.

J'utilise ce concept avec Zope3, et j'avoue avoir du mal à cerner non le rôle des interfaces (contrat, ...) mais leur utilité dans un projet. Sans doute parce que mes applis (enfin, mes essais d'applis) n'ont pas le volume suffisant : je subis le concept au lieu de l'utiliser vraiment.

A ce jour, l'intérêt principal que je trouve à mes interfaces, c'est de structurer la doc correctement : comme c'est incontournable, je suis bien obligé de rédiger un minimum de doc. Par ailleurs, cela me permet de comprendre les interfaces des autres, ce qui n'est pas négligeable ! Les projets Zope 3 sont systématiquement documentés, et ça aide !

A bientôt

JMarc
Avatar de wiztricks wiztricks - Modérateur https://www.developpez.com
le 05/11/2009 à 22:28
Zope est un monde à lui tout seul.
Les interfaces vis à vis des composants sont découvertes par introspection - en fait c'est écrit en Python, langage dynamique s'il en est.
Je ne sais pas si les motivations de ce que nous avons raconté ici peuvent s'appliquer à un tel monde.
Note: Les soucis à résoudre lorsqu'on fait des composants avec du langage compilé sont identiques. Mais le 'dynamique' permet de lier les objets de façon assez originale et facile.
- W
Offres d'emploi IT
Chef projet big data - pse flotte H/F
Safran - Ile de France - Évry (91090)
Consultant sap finance/controlling H/F
Safran - Ile de France - Vélizy-Villacoublay (78140)
Architecte technique des systèmes d'information H/F
Safran - Ile de France - Évry (91090)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique ALM