inversion of control e dependency injection (ita)

Post on 19-Jun-2015

1.655 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

Inversion of Controle

Dependency Injection

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

che cosa si intende per IoC ?

questa classe ha un problema

questa classe ha un problema

Questa classe ha un problema *

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

questa classe ha un problema

La classe MyBusinessLogic è dipendente dall'implementazione concreta di FileLogger

questa classe ha un problema

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

l'implementazione di FileLogger

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

proviamo a sistemarla

proviamo a sistemarla

proviamo a sistemarla

ora la dipendenza esterna è stata astratta con un'interfaccia

proviamo a sistemarla

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

proviamo a sistemarla

cosi' facendo la dipendenza è stata invertita

proviamo a sistemarla

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

dipendenza.

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

Test Driven Development (TDD)

La dependency injection è il modo più pulito

per rendere il codice testabile

Test Driven Development (TDD)

La dependency injection è il modo migliore

per disaccoppiare il codice

Test Driven Development (TDD)

ne consegue che ...

Test Driven Development (TDD)

TDD ==> codice disaccoppiato gratis !!!

Test Driven Development (TDD)

Provare per credere ! :-)

Test Driven Development (TDD)

Test Driven Development (TDD)

Depenedency Injection Rocks !!!

Depenedency Injection Rocks !!!

ma a volte ...

Depenedency Injection Rocks !!!

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

Depenedency Injection Rocks !!!

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

SomeService Factory Method

Depenedency Injection Rocks !!!

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

SomeService Factory Method

Frameworks di IoC o Inversion of control

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

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)

Frameworks di IoC

noi utilizziamo sempre "Constructor Injection"

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

Frameworks di IoC

esempio con Castle

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

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."

Frameworks di IoC

Esempio … con OpenRasta e DI

-- Parte 2 --

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

-- Parte 2 --

vediamo cosa ne pensa David Heinemeier Hansson

dei framework di IoC ...

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

-- 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)

-- Parte 2 --

ref. “Beyond Java” by Bruce Tate

pag. 113 Dependency Injection

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

top related