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.
2. 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
5. questa classe ha un problema Questa classe ha un problema * * http://www.objectmentor.com/resources/articles/dip.pdf
6. questa classe ha un problema La classe MyBusinessLogic è dipendente dall'implementazione concreta di FileLogger
7. questa classe ha un problema Nel caso volessi riutilizzare la classe MyBusinessLogic, devo "copiare" nel nuovo progetto anche l'implementazione di FileLogger
8. 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
14. proviamo a sistemarla ora la classe MyBusinessLogic dipende da qualcun'altro che dall'esterno deve passare la dipendenza.
15. 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
16. Test Driven Development (TDD) La dependency injection è il modo più pulito per rendere il codice testabile
17. Test Driven Development (TDD) La dependency injection è il modo migliore per disaccoppiare il codice
33. 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
35. Frameworks di IoC Quando usare la configurazione su file e quando via codice ?
36. 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."
39. -- 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
40. -- Parte 2 -- vediamo cosa ne pensa David Heinemeier Hansson dei framework di IoC ... * http://www.scribemedia.org/2006/07/09/dhh/
41. -- Parte 2 -- Il concetto di DI è importantissimo, ma nei linguaggi dinamici non servono framework complessi per implementarlo ... meglio ... si possono ottenere gli stessi risultati con minore sforzo (meno codice)
42. -- Parte 2 -- ref. “Beyond Java” by Bruce Tate pag. 113 Dependency Injection
43. -- 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