Design pattern IoC

Design pattern IoC - Java - Programmation

Marsh Posté le 05-09-2010 à 13:20:22    

Hello les amis,
 
Quelqu'un peut-il expliquer le design pattern IoC (injection of control) ?
 
De même la différence entre l'injection de contrôle et l'injection de dépendance ?
 
 :jap:  

Reply

Marsh Posté le 05-09-2010 à 13:20:22   

Reply

Marsh Posté le 05-09-2010 à 14:22:37    

IOC Inversion of control

 

Un très bon article :

 

http://dotnetslackers.com/articles [...] Part1.aspx

Message cité 1 fois
Message édité par exhortae le 05-09-2010 à 14:23:10
Reply

Marsh Posté le 05-09-2010 à 16:00:58    

exhortae a écrit :

IOC Inversion of control
 
Un très bon article :
 
http://dotnetslackers.com/articles [...] Part1.aspx


 
C'est le topic java. Donc j'aimerai bien des exemple java pas .NET, comme avec spring & co.
 
oust les crosofts :)

Reply

Marsh Posté le 05-09-2010 à 16:06:06    

Hm. Peu importe (ou presque) le langage lorsque la discussion porte sur les design patterns.

Reply

Marsh Posté le 05-09-2010 à 17:00:04    

Ca sert à faciliter le remplacement de services par d'autres services, et en particulier par des Mocks pour le test.

 

Exemple: tu écris un client qui appelle deux services quelconques

Code :
  1. public class ZeClient {
  2.   private DbManagerInterface dbMgr;
  3.   private ExternalServiceInterface extService;
  4. }
 

Sans IoC, ta classe client va instancier elle-même dbMgr et extService (via des Factory par ex).
Avec IoC, l'instanciation se fait en-dehors de ta classe.
Celle-ci ne va que conserver les instances existantes déjà créées. On injecte ces instances via le constructeur ou via des setters

 
Code :
  1. public class ZeClient {
  2.   private DbManagerInterface dbMgr;
  3.   private ExternalServiceInterface extService;
  4.  
  5.  public ZeClient(DbManagerInterface dbMgr, ExternalServiceInterface extSrv){
  6.      this.dbMg= dbMgr;
  7.      this.extService = extSrv;
  8.  }
  9.  
  10.  public void setExtService(ExternalServiceInterface extSrv) {
  11.      this.extSrv = extSrv;
  12.  }
  13.  
  14.  public void setDbMgr(DbManagerInterface dbMgr) {
  15.      this.dbMgr = dbMgr;
  16.  }
  17. }
 

Il faut imaginer que dans une vraie application, ma classe ZeClient peut avoir facilement 5 ou 6 services (voire bcp plus), qui eux-mêmes appellent plusieurs services.
Du coup, dans une classe de test, quand j'instancie ZeClient, j'instancie au préalable tout l'arbre de dépendances des services dont il dépend potentiellement (même si dans mon test, je n'en utilise en réalité qu'un seul). Ca a deux inconvénients:
1. ZeClient embarque avec lui tous les services qu'il instancie. Sauf à modifier un fichier de mapping interface<->implémentation, on ne peut pas changer les services dbMgr et extService sans avoir à modifier le code de ZeClient.
2. Pour un test qui se veut unitaire de ZeClient, je suis obligé de créer tout l'univers: certains services, avant d'être utilisables, peuvent être pénibles à configurer, par ex, pour une base de donnée et un service externe, il faut préalablement que la base et le service en question existent sur le réseau et répondent correctement. Pour peu que chacun des services que ZeClient utilise appelle lui-même d'autres services, il faut tout configurer et il faut que tout fonctionne avant même de pouvoir lancer le moindre test. On ne fait plus de l'unitaire, mais de l'intégration, alors qu'on voudrait pouvoir juste les mocker pour retourner une valeur donnée quelconque.
Avec IoC, parce que ZeClient n'instancie plus rien lui-même, on peut créer les mocks, les instancier soi-même, et les injecter via le constructeur ou les setteurs.


Message édité par el muchacho le 05-09-2010 à 17:18:19

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 05-09-2010 à 17:44:02    


Ok, donc IoC sert principalement à instancier des objets et les initialiser dans les attributs d'une classe. On peut aussi faire des Mocks pour les tests grace à IoC.
Si je dis ca en entretien, ca risque de faire léger.
 
Et sinon quelle différence avec Injection de Dépendance ?

Reply

Marsh Posté le 05-09-2010 à 23:15:30    

pharaon2005 a écrit :


 
C'est le topic java. Donc j'aimerai bien des exemple java pas .NET, comme avec spring & co.
 
oust les crosofts :)


 
Cet exemple explique clairement la différence entre ioc et injection de dépendances, si je l'ai donné c'est parce qu’il te permettra à coup sûr de la comprendre sans trop de prise de tête (15-20 minutes de lecture).

Reply

Marsh Posté le 06-09-2010 à 00:10:44    

pharaon2005 a écrit :


Ok, donc IoC sert principalement à instancier des objets et les initialiser dans les attributs d'une classe. On peut aussi faire des Mocks pour les tests grace à IoC.
Si je dis ca en entretien, ca risque de faire léger.
 
Et sinon quelle différence avec Injection de Dépendance ?


Si c'est juste pour passer un entretien, oublie, c'est pas comme ça que tu vas faire illusion. Ca sert à rien de tenter de faire croire qu'on sait, au contraire, ça fait particulièrement mauvais effet. D'ailleurs, ta question montre que tu n'as pas compris grand chose...


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 06-09-2010 à 14:32:37    

pharaon2005 a écrit :


Et sinon quelle différence avec Injection de Dépendance ?


L'injection de dépendance est un des pattern pour implémenter l'inversion de contrôle.  [:tartalap]

Reply

Marsh Posté le 11-09-2010 à 23:08:27    

Bon je crois que j'ai pijé.

 

IoC = Inversion de contrôle = principe d'Hollywood "Ne m'appelez pas, c'est moi qui vous appelle"
En général c'est l'application qui appelle le framework, et bien dans IoC c'est le framework qui appelle l'application. Les rôles sont inversés.
C'est Spring qui se charge de la mise en relation des objets, et non les objets qui utilisent le framework pour se mettre en relation.

 

Injection de dépendance = découplage des objets
A utilise (dépend de) B -> couplage fort entre A et B
B est injecté dans A -> couplage faible entre A et B
Dans l'injection de dépendance Spring, c'est le framework qui s'occupe d'instancier B et de l'injecter dans A.

 

[:zinbou]

 


Message édité par pharaon2005 le 11-09-2010 à 23:11:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed