Design Patterns http://blogs.ugidotnet.org/marcomangia/category/Design Patterns.aspx Design Patterns it-IT marco mangia Subtext Version 2.6.0.0 Ioc: e adesso ciak http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx Ecco la versione video dell'articolo pubblicato <a href="http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx">qui</a> . Ho inserito qualche vignetta di Scott Adams che sono riuscito a trovare in giro, modificandola. Dilbert che esce fuori dal suo cubicle e finisce su una ppt..<br /> <br /> NB:<br /> <ul> <li> non sono uno speaker professionista !!</li> <li>a causa di settaggi forse errati, stiamo cercando di capire il problema di alcune distorsioni</li> <li>volevo ringraziare <a href="http://www.vivendobyte.net/">Igor</a> per l'incoraggiamento</li> </ul> Qui le slides: <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/marcomangia/DesignPattern_Integration_DIP.pptx">Dependency Inversion Principle</a><br /> <br /> <br /> <object height="498" width="640"> <param value="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/flvplayer.swf" name="movie" /> <param value="high" name="quality" /> <param value="#FFFFFF" name="bgcolor" /> <param value="thumb=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/FirstFrame.jpg&amp;containerwidth=640&amp;containerheight=498&amp;content=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/DependencyInjection.mp4" name="flashVars" /> <param value="true" name="allowFullScreen" /> <param value="showall" name="scale" /> <param value="always" name="allowScriptAccess" /> <param value="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/" name="base" /> <embed height="498" width="640" scale="showall" base="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/FirstFrame.jpg&amp;containerwidth=640&amp;containerheight=498&amp;content=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/DependencyInjection.mp4" allowscriptaccess="always" type="application/x-shockwave-flash" bgcolor="#FFFFFF" quality="high" src="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/flvplayer.swf" /><br /> <br /> <br /> <br /> </object><img src="http://blogs.ugidotnet.org/marcomangia/aggbug/97034.aspx" width="1" height="1" /> marco mangia http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx Fri, 11 Sep 2009 12:34:40 GMT http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx#feedback 1218 http://blogs.ugidotnet.org/marcomangia/comments/commentRss/97034.aspx http://blogs.ugidotnet.org/marcomangia/services/trackbacks/97034.aspx IoC: maccheroni per programmatori procedurali http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx In questo primo articolo darò un'introduzione "infantile" al concetto di Inversion of Control(IoC) ed ad una sua implementazione tramite il pattern di Dependency Injection(DI). Sebbene IoC e DI siano considerati sinonimi, mi è sembrato di capire che DI sia una implementazione particolare di IoC, a mano o tramite framework. Comuque, qui non farò riferimento a framework particolari, ma solo al principio di base che dovrebbe condurci a scrivere codice a basso accoppiamento (low coupling).<br /> <br /> <font size="4">P</font>er una mia innata prigrizia, mi piace di più usare le immagini per fissare i concetti. Non sto qui ad elencare i motivi biologici. <br /> <br /> <img hspace="10" height="400" width="500" vspace="10" align="absbottom" src="http://www.mamagarage.com/wp-content/uploads/DependencyInversionPrinciple_5F00_0278F9E2.jpg" alt="Dependendency Inversion Principle" /><br /> Già, chi collegherebbe una lampada saldandola ai cavi elettrici nella parete ? A patto che abbia voglia di vincere il <a href="http://www.darwinawards.com/">premio Darwin</a> di quest'anno. Il problema è che non sono sicuro del risultato finale ... <br /> <br /> <span style="font-weight: bold;">DIP in pratica ci spinge a utilizzare e dipendere da interfacce</span> (o astrazioni). Quasi non c'è più niente da dire, vista la banalità della cosa. Pigro sì, ma pragmatico: <br /> <ul> <li>Nessuna classe dovrebbe derivare da un tipo concreto </li> <li>Nessuna variabile dovrebbe avere un riferimento ad un tipo concreto </li> <li>Nessun metodo dovrebbe fare l'override di un metodo implementato in qualcuna delle sue classi base </li> </ul> <p>Altre due imaginette ci aiutano a capire ancora meglio: <br /> <img hspace="10" height="336" width="338" align="left" src="/images/blogs_ugidotnet_org/marcomangia/BeforeDIPzip.jpg" alt="" /> <br /> <br /> Nella prima una classe consumer ha delle dipendenze con le classi concrete, ovvero ha il comp ci creare uno dei tre tipi facendo ricorso all'operatore <span style="color: rgb(51, 102, 255); font-weight: bold;">new</span> <br /> <br /> <br /> E' il caso appunto in ciui <span style="font-style: italic;">componenti  ad alto livello</span> dipendono da <span style="font-style: italic;">componenti a basso </span>livello <br /> <br /> <br /> Il verso della dipendenza imita molto quello della tipica programmazione procederale <br /> <br /> </p> <br /> <br /> <!-- code formatted by http://manoli.net/csharpformat/ --> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> Dependent<br />{<br /> <span class="kwrd">public</span> IDependent _dependent;<br /> <span class="kwrd">public</span> <span class="kwrd">void</span> DoSomething(<span class="kwrd">string</span> dependent)<br /> {<br /> <span class="kwrd">if</span> (dependent.EndsWith(<span class="str">"1"</span>))<br /> _dependent = <span class="kwrd">new</span> DependentClass1();<br /> <span class="kwrd">if</span> (dependent.EndsWith(<span class="str">"2"</span>))<br /> _dependent = <span class="kwrd">new</span> DependentClass2();<br /> <span class="kwrd">if</span> (dependent.EndsWith(<span class="str">"3"</span>))<br /> _dependent = <span class="kwrd">new</span> DependentClass3();<br /> _dependent.DoSomethingInDependent();<br /> }<br />}<br /><br /></pre> La seconda invece ci mostra gli effetti della cura dopo aver implementato DIP: <img hspace="10" height="389" width="336" vspace="10" align="left" src="/images/blogs_ugidotnet_org/marcomangia/AfterDIPzip.jpg" alt="" /> <br /> <br /> <br /> L'iniettore della dipendenza stesso dipende da una astrazione (classe <span style="color: rgb(51, 102, 255);">abstract</span> o tipo <span style="color: rgb(51, 102, 255);">interface</span>). Ovvero possiede un riferimento all'interfaccia tramite un campo privato <br /> <br /> <br /> <br /> <br /> <br /> Così i tipi concreti che derivano dall'interfaccia, implementandola <br /> <br /> <br /> Il verso della dipendenza si è <span style="font-style: italic;">invertita, </span>da questo il nome di Inversione di Controllo (mesi fà mi dicevo: inversione de che ??) <br /> <br /> <!-- code formatted by http://manoli.net/csharpformat/ --> <pre class="csharpcode"> <span class="kwrd">public</span> <span class="kwrd">class</span> Injector<br /> {<br /> <span class="kwrd">private</span> IDependent _dependent;<br /> <span class="kwrd">public</span> IDependent Dependent<br /> {<br /> get { <span class="kwrd">return</span> _dependent; }<br /> set { _dependent = <span class="kwrd">value</span>; }<br /> }<br /> <span class="kwrd">public</span> <span class="kwrd">void</span> DoSomething()<br /> {<br /> Dependent.DoSomethingInDependent();<br /> } <br /> }<span style="font-family: Arial,Verdana,Sans-Serif;"><br /></span><br /></pre> Persino il class diagram, uhh: <img style="width: 614px; height: 210px;" src="/images/blogs_ugidotnet_org/marcomangia/UmlDIPzip(1).jpg" alt="" /> <br /> <a href="http://martinfowler.com">Martin Fowler</a> in suo <a href="http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection">famosissimo articolo</a> ci insegna 3 tipi di DI: <br /> <ul> <li>Iniezione tramite metodi d'interfaccia di Tipo 1 <br /> </li> <li>Iniezione tramite proprietà di Tipo 2 <br /> </li> <li>Iniezione tramite costruttore di Tipo 3 <br /> </li> </ul> La prima è quella che obbliga a definire un'interfaccia (da non confondersi con l'<span style="font-style: italic;">astrazione</span> necessaria al DIP) , dalla quale poi l'iniettore dovrà derivare, constringendolo ad implementare i metodi <br /> La seconda invece è la proprietà che si preoccupa di valorizzare il campo privato che rappresenta la dipendenza verso l'interfaccia <br /> La terza invece è quella in cui, il riferimento viene risolto nel momento in cui l'iniettore viene creato, dovendolo passare come parametro. <br /> <br /> Forse Martin si era sparato tutti i cofanetti di Spielberg prima di scrivere l'articolo, diciamo che non farei una distinzione così ferrea tra tipi, basta capire quando ci servono. <br /> Delle tre, la prima non l'ho mai usata nè vista usare. Dopo tutto devo scrivere del codice in più. Preferisco la seconda e la terza modalità o un misto delle due, poichè mi risulta comodo per lo "state based unit-testing", cioè posso governare e controllare come viene risolta la dipendenza. Userei solo la seconda o al massimo la prima solo quando ho bisogno di posticipare l'iniezione. <br />   <img hspace="10" height="105" width="104" align="left" src="/images/blogs_ugidotnet_org/marcomangia/anti-if.gif" alt="" /> <br /> Dimenticavo, appena posso mi comprerò questa simpatica magliettina che fa parte della <a href="http://www.antiifcampaign.com/index.html">campagna anti-if</a> promossa da xplabs. <br /> <br /> E' proprio IoC, uno dei mezzi che ci aiutano in questa battaglia. Non per <span style="font-style: italic;">if</span> stesso ma per un suo abuso, chiaro.<br /> <br /> <br /> <br /> <br /> NB: ho fatto anche un versione video, o <span style="font-weight: bold;">screencast</span>, di questo articolo. Devo un attimo sistemare il "montaggio". Ho Sergio Leone in chat che mi sta dando dei validi consigli. Lo pubblico più tardi o al max domani mattina.<img src="http://blogs.ugidotnet.org/marcomangia/aggbug/97027.aspx" width="1" height="1" /> marco mangia http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx Wed, 09 Sep 2009 17:28:03 GMT http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx#feedback 1208 http://blogs.ugidotnet.org/marcomangia/comments/commentRss/97027.aspx http://blogs.ugidotnet.org/marcomangia/services/trackbacks/97027.aspx