<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Design Patterns</title>
        <link>http://blogs.ugidotnet.org/marcomangia/category/Design Patterns.aspx</link>
        <description>Design Patterns</description>
        <language>it-IT</language>
        <copyright>marco mangia</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Ioc: e adesso ciak</title>
            <link>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx</link>
            <description>Ecco la versione video dell'articolo pubblicato &lt;a href="http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx"&gt;qui&lt;/a&gt; . 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..&lt;br /&gt;
&lt;br /&gt;
NB:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt; non sono uno speaker professionista !!&lt;/li&gt;
    &lt;li&gt;a causa di settaggi forse errati, stiamo cercando di capire il problema di alcune distorsioni&lt;/li&gt;
    &lt;li&gt;volevo ringraziare &lt;a href="http://www.vivendobyte.net/"&gt;Igor&lt;/a&gt; per l'incoraggiamento&lt;/li&gt;
&lt;/ul&gt;
Qui le slides: &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/marcomangia/DesignPattern_Integration_DIP.pptx"&gt;Dependency Inversion Principle&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;object height="498" width="640"&gt;
&lt;param value="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/flvplayer.swf" name="movie" /&gt;
&lt;param value="high" name="quality" /&gt;
&lt;param value="#FFFFFF" name="bgcolor" /&gt;
&lt;param value="thumb=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/FirstFrame.jpg&amp;amp;containerwidth=640&amp;amp;containerheight=498&amp;amp;content=http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/DependencyInjection.mp4" name="flashVars" /&gt;
&lt;param value="true" name="allowFullScreen" /&gt;
&lt;param value="showall" name="scale" /&gt;
&lt;param value="always" name="allowScriptAccess" /&gt;
&lt;param value="http://content.screencast.com/users/MarcoMangia/folders/Design%20Patterns/media/149be8e0-5c70-4efd-904d-21425c1629d2/" name="base" /&gt;  &lt;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;amp;containerwidth=640&amp;amp;containerheight=498&amp;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" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/object&gt;&lt;img src="http://blogs.ugidotnet.org/marcomangia/aggbug/97034.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>marco mangia</dc:creator>
            <guid>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx</guid>
            <pubDate>Fri, 11 Sep 2009 12:34:40 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/11/ioc-e-adesso-ciak.aspx#feedback</comments>
            <slash:comments>1218</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/marcomangia/comments/commentRss/97034.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/marcomangia/services/trackbacks/97034.aspx</trackback:ping>
            <enclosure url="http://pgiewg.bay.livefilestore.com/y1phWFK1tg0Ev8Xws3Vod_bKn9QBvIQQkUXYzhZo-UwTpUq7ZyGQK-4jwJivMdtW9SikReYNYka-1oz3KLHEqPSFhv8EZPOaBHl/DesignPattern_Integration_DIP.pptx?download" length="1233992" type="application/mspowerpoint" />
        </item>
        <item>
            <title>IoC: maccheroni per programmatori procedurali</title>
            <link>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx</link>
            <description>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).&lt;br /&gt;
&lt;br /&gt;
&lt;font size="4"&gt;P&lt;/font&gt;er una mia innata prigrizia, mi piace di più usare le immagini per fissare i concetti. Non sto qui ad elencare i motivi biologici. &lt;br /&gt;
&lt;br /&gt;
&lt;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" /&gt;&lt;br /&gt;
Già, chi collegherebbe una lampada saldandola ai cavi elettrici nella parete ? A patto che abbia voglia di vincere il &lt;a href="http://www.darwinawards.com/"&gt;premio Darwin&lt;/a&gt; di quest'anno. Il problema è che non sono sicuro del risultato finale ... &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;DIP in pratica ci spinge a utilizzare e dipendere da interfacce&lt;/span&gt; (o astrazioni). Quasi non c'è più niente da dire, vista la banalità della cosa. Pigro sì, ma pragmatico: &lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Nessuna classe dovrebbe derivare da un tipo concreto &lt;/li&gt;
    &lt;li&gt;Nessuna variabile dovrebbe avere un riferimento ad un tipo concreto &lt;/li&gt;
    &lt;li&gt;Nessun metodo dovrebbe fare l'override di un metodo implementato in qualcuna delle sue classi base &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Altre due imaginette ci aiutano a capire ancora meglio: &lt;br /&gt;
&lt;img hspace="10" height="336" width="338" align="left" src="/images/blogs_ugidotnet_org/marcomangia/BeforeDIPzip.jpg" alt="" /&gt; &lt;br /&gt;
&lt;br /&gt;
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 &lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;new&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
E' il caso appunto in ciui &lt;span style="font-style: italic;"&gt;componenti  ad alto livello&lt;/span&gt; dipendono da &lt;span style="font-style: italic;"&gt;componenti a basso &lt;/span&gt;livello &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il verso della dipendenza imita molto quello della tipica programmazione procederale &lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Dependent&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IDependent _dependent;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DoSomething(&lt;span class="kwrd"&gt;string&lt;/span&gt; dependent)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (dependent.EndsWith(&lt;span class="str"&gt;"1"&lt;/span&gt;))&lt;br /&gt;            _dependent = &lt;span class="kwrd"&gt;new&lt;/span&gt; DependentClass1();&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (dependent.EndsWith(&lt;span class="str"&gt;"2"&lt;/span&gt;))&lt;br /&gt;            _dependent = &lt;span class="kwrd"&gt;new&lt;/span&gt; DependentClass2();&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (dependent.EndsWith(&lt;span class="str"&gt;"3"&lt;/span&gt;))&lt;br /&gt;            _dependent = &lt;span class="kwrd"&gt;new&lt;/span&gt; DependentClass3();&lt;br /&gt;        _dependent.DoSomethingInDependent();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
La seconda invece ci mostra gli effetti della cura dopo aver implementato DIP: &lt;img hspace="10" height="389" width="336" vspace="10" align="left" src="/images/blogs_ugidotnet_org/marcomangia/AfterDIPzip.jpg" alt="" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'iniettore della dipendenza stesso dipende da una astrazione (classe &lt;span style="color: rgb(51, 102, 255);"&gt;abstract&lt;/span&gt; o tipo &lt;span style="color: rgb(51, 102, 255);"&gt;interface&lt;/span&gt;). Ovvero possiede un riferimento all'interfaccia tramite un campo privato &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Così i tipi concreti che derivano dall'interfaccia, implementandola &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il verso della dipendenza si è &lt;span style="font-style: italic;"&gt;invertita, &lt;/span&gt;da questo il nome di Inversione di Controllo (mesi fà mi dicevo: inversione de che ??) &lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Injector&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; IDependent _dependent;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IDependent Dependent&lt;br /&gt;        {&lt;br /&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _dependent; }&lt;br /&gt;            set { _dependent = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DoSomething()&lt;br /&gt;        {&lt;br /&gt;            Dependent.DoSomethingInDependent();&lt;br /&gt;        }   &lt;br /&gt;    }&lt;span style="font-family: Arial,Verdana,Sans-Serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
Persino il class diagram, uhh: &lt;img style="width: 614px; height: 210px;" src="/images/blogs_ugidotnet_org/marcomangia/UmlDIPzip(1).jpg" alt="" /&gt; &lt;br /&gt;
&lt;a href="http://martinfowler.com"&gt;Martin Fowler&lt;/a&gt; in suo &lt;a href="http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection"&gt;famosissimo articolo&lt;/a&gt; ci insegna 3 tipi di DI: &lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Iniezione tramite metodi d'interfaccia di Tipo 1 &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Iniezione tramite proprietà di Tipo 2 &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Iniezione tramite costruttore di Tipo 3 &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
La prima è quella che obbliga a definire un'interfaccia (da non confondersi con l'&lt;span style="font-style: italic;"&gt;astrazione&lt;/span&gt; necessaria al DIP) , dalla quale poi l'iniettore dovrà derivare, constringendolo ad implementare i metodi &lt;br /&gt;
La seconda invece è la proprietà che si preoccupa di valorizzare il campo privato che rappresenta la dipendenza verso l'interfaccia &lt;br /&gt;
La terza invece è quella in cui, il riferimento viene risolto nel momento in cui l'iniettore viene creato, dovendolo passare come parametro. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
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. &lt;br /&gt;
  &lt;img hspace="10" height="105" width="104" align="left" src="/images/blogs_ugidotnet_org/marcomangia/anti-if.gif" alt="" /&gt; &lt;br /&gt;
Dimenticavo, appena posso mi comprerò questa simpatica magliettina che fa parte della &lt;a href="http://www.antiifcampaign.com/index.html"&gt;campagna anti-if&lt;/a&gt; promossa da xplabs. &lt;br /&gt;
&lt;br /&gt;
E' proprio IoC, uno dei mezzi che ci aiutano in questa battaglia. Non per &lt;span style="font-style: italic;"&gt;if&lt;/span&gt; stesso ma per un suo abuso, chiaro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB: ho fatto anche un versione video, o &lt;span style="font-weight: bold;"&gt;screencast&lt;/span&gt;, 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.&lt;img src="http://blogs.ugidotnet.org/marcomangia/aggbug/97027.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>marco mangia</dc:creator>
            <guid>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx</guid>
            <pubDate>Wed, 09 Sep 2009 17:28:03 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/marcomangia/archive/2009/09/09/ioc-maccheroni-per-programmatori-procedurali-again.aspx#feedback</comments>
            <slash:comments>1208</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/marcomangia/comments/commentRss/97027.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/marcomangia/services/trackbacks/97027.aspx</trackback:ping>
        </item>
    </channel>
</rss>