Inversion of control e Dependency Injection (ITA)

41
Inversion of Control e Dependency Injection

description

This is an old presentation I've given for a Lunch&Learn in my previous job. In this presentation I'm trying to explain the concept of Inversion of Control, It's advantages and how Test Driven Development forces you to embrace this approach. When the dependencies becomes many the need for a framework arise, those frameworks are usually called IoC. Than quickly I intruduce the difference in Dynamic Languages as Ruby.

Transcript of Inversion of control e Dependency Injection (ITA)

Page 1: Inversion of control e Dependency Injection (ITA)

Inversion of Controle

Dependency Injection

Page 2: Inversion of control e Dependency Injection (ITA)

solo una questione di termini ...

Dependency Injection (DI)è una forma di

Inversion of Control (IoC)

"se puoi chiamarlo con il nome giusto, allora puoi farlo correttamente", anonimo

Page 3: Inversion of control e Dependency Injection (ITA)

che cosa si intende per IoC ?

Page 4: Inversion of control e Dependency Injection (ITA)

questa classe ha un problema

Page 5: Inversion of control e Dependency Injection (ITA)

questa classe ha un problema

Questa classe ha un problema *

* http://www.objectmentor.com/resources/articles/dip.pdf

Page 6: Inversion of control e Dependency Injection (ITA)

questa classe ha un problema

La classe MyBusinessLogic è dipendente dall'implementazione concreta di FileLogger

Page 7: Inversion of control e Dependency Injection (ITA)

questa classe ha un problema

Nel caso volessi riutilizzare la classe MyBusinessLogic, devo "copiare" nel nuovo progetto anche

l'implementazione di FileLogger

Page 8: Inversion of control e Dependency Injection (ITA)

questa classe ha un problema

Nel caso volessi cambiare logger, devo modificare la classe MyBusinessLogic violando il principio di Single

Responsability** http://www.objectmentor.com/resources/articles/srp.pdf

Page 9: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

Page 10: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

Page 11: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

ora la dipendenza esterna è stata astratta con un'interfaccia

Page 12: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

ora il logger concreto deve essere passato (injected) come parametro del costruttore

Page 13: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

cosi' facendo la dipendenza è stata invertita

Page 14: Inversion of control e Dependency Injection (ITA)

proviamo a sistemarla

ora la classe MyBusinessLogic dipende da qualcun'altro che dall'esterno deve passare la

dipendenza.

Page 15: Inversion of control e Dependency Injection (ITA)

ritornando alla terminologia,la Dependency Injection (DI)

è una forma di Inversion of Control (IoC)

noi in genere utilizziamo solo DI, quindi d'ora in poi parleremo

solo di DI

Page 16: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

La dependency injection è il modo più pulito

per rendere il codice testabile

Page 17: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

La dependency injection è il modo migliore

per disaccoppiare il codice

Page 18: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

ne consegue che ...

Page 19: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

TDD ==> codice disaccoppiato gratis !!!

Page 20: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

Provare per credere ! :-)

Page 21: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

Page 22: Inversion of control e Dependency Injection (ITA)

Test Driven Development (TDD)

Page 23: Inversion of control e Dependency Injection (ITA)

Depenedency Injection Rocks !!!

Page 24: Inversion of control e Dependency Injection (ITA)

Depenedency Injection Rocks !!!

ma a volte ...

Page 25: Inversion of control e Dependency Injection (ITA)

Depenedency Injection Rocks !!!

ndr: ATTENZIONE !!! questo codice è lineare e leggibile

Page 26: Inversion of control e Dependency Injection (ITA)

Depenedency Injection Rocks !!!

quando il codice è scritto bene in Test Driven, le responsabilità sono ben isolate e ...

SomeService Factory Method

Page 27: Inversion of control e Dependency Injection (ITA)

Depenedency Injection Rocks !!!

... le dipendenze e le relative configurazionisi moltiplicano ...

SomeService Factory Method

Page 28: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC o Inversion of control

containersPossono essere di aiuto gli IoC Containers, tra i più famosi ...

Page 29: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC

ci sono 3 tipi principali di DI *:• Constructor injection• Setter injection• Interface injection

* Martin Fowler http://martinfowler.com/articles/injection.html (Jan 2004)

Page 30: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC

noi utilizziamo sempre "Constructor Injection"

Page 31: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC

noi utilizziamo sempre "Constructor Injection"

"If you use Dependency Injection there are a number of styles to choose between. I would suggest you follow constructor injection unless you run into one of the specific problems with that approach, in which case switch to setter injection. ", Martin Fowler

Page 32: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC

esempio con Castle

Page 33: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC Quando usare la configurazione su file e quando via codice ?

Page 34: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC Quando usare la configurazione su file e quando via codice ?

Fowler consiglia: "For most applications that are likely to be deployed in many places, a separate configuration file usually makes most sense. Almost all the time this will be an XML file, and this makes sense. However there are cases where it's easier to use program code to do the assembly. One case is where you have a simple application that's not got a lot of deployment variation. In this case a bit of code can be clearer than a separate XML file."

Page 35: Inversion of control e Dependency Injection (ITA)

Frameworks di IoC

Esempio … con OpenRasta e DI

Page 36: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --

Page 37: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --

"... il vostro amico Happy Harry Hard Onè qui per ricordarvi

di mangiare i cereali con la forchetta,e di fare i compiti al buio ...", da Pump Up The Volume

Page 38: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --

vediamo cosa ne pensa David Heinemeier Hansson

dei framework di IoC ...

* http://www.scribemedia.org/2006/07/09/dhh/

Page 39: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --

Il concetto di DI è importantissimo, ma nei linguaggi dinamici non servono framework

complessiper implementarlo

... meglio ...

si possono ottenere gli stessi risultati con minore sforzo (meno codice)

Page 40: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --

ref. “Beyond Java” by Bruce Tate

pag. 113 Dependency Injection

Page 41: Inversion of control e Dependency Injection (ITA)

-- Parte 2 --Esempio Ruby

class MyBusinessLogic def Execute() Logger.LogEvent("My Event") end end

ora in qualsiasi punto del codice posso sempre, dinamicamente ridefinire la classe Logger

class Logger def LogEvent(msg) .... end end