<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>AntonioGanci</title>
        <link>http://blogs.ugidotnet.org/AntonioGanci/Default.aspx</link>
        <description>Il blog di Antonio Ganci</description>
        <language>it-IT</language>
        <copyright>Antonio Ganci</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>AntonioGanci</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/AntonioGanci/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Le condizioni per avere successo nello sviluppo di un software</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/17/le-condizioni-per-avere-successo-nello-sviluppo-di-un-software.aspx</link>
            <description>&lt;p&gt;Il &lt;a href="http://pierg.wordpress.com/2010/01/04/make-yourself-a-gift-quit/"&gt;post&lt;/a&gt; di Piergiorgio mi  ha fatto venire in mente che a volte non ci sono le condizioni per avere successo in un progetto.  &lt;/p&gt;
&lt;p&gt;   Per lavorare al meglio &lt;span style="font-weight: bold;"&gt;un team deve essere motivato ed un obiettivo chiaro e realistico concorre a   tenere alta la motivazione&lt;/span&gt;.  &lt;/p&gt;
&lt;p&gt;   Se l'obiettivo è poco chiaro, troppo lontano, troppo ambizioso il lavoro diventa routine, oppure   ci si scoraggia perchè si pensa di non riuscire, oppure ci si annoia perchè non si vede   mai la fine.  &lt;/p&gt;
&lt;p&gt;   Quindi prima di iniziare un nuovo progetto è fondamentale avere ben chiaro quali sono le condizioni   per avere successo.   &lt;/p&gt;
&lt;p&gt;   Le seguenti domande potrebbero essere di aiuto:  &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Chi finanzia il progetto? Qual'è il suo interesse nel progetto, perchè ha deciso    di investirci dei soldi?&lt;/li&gt;
    &lt;li&gt;Chi lo utilizzerà? Cosa si aspetta che faccia il software? Quali problemi gli risolve?    &lt;/li&gt;
    &lt;li&gt;Quali sono i tempi di consegna utili? Quali sono le funzionalità affinchè     il software si possa dire completo e funzionante?        &lt;/li&gt;
    &lt;li&gt;Qual è la velocità di risposta del sistema affinchè non sia troppo lento?    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  La prima domanda è fondamentale: qualcuno sta investendo i suoi soldi per il software che dovremo  sviluppare e quindi è importante capire il &lt;span style="font-weight: bold;"&gt;percnè investe questi soldi e quali sono le sue  aspettative&lt;/span&gt;. &lt;/p&gt;
&lt;p&gt;  La seconda domanda serve per capire come rendere felici gli utenti, se gli utenti sono felici ne parleranno  bene e l'investitore sarà soddisfatto dell'investimento. &lt;/p&gt;
&lt;p&gt;  Questi aspetti se trascurati possono portare ad un grosso spreco di denaro e frustrazione.   Possono farci &lt;em&gt;odiare&lt;/em&gt; il cliente ma la colpa potrebbe essere nostra perchè   non gli stiamo dando valore, stiamo sviluppando qualcosa che &lt;strong&gt;pensiamo&lt;/strong&gt; dia valore,   ma nella realtà soddisfa solo il nostro ego. &lt;/p&gt;
&lt;p&gt;  L'emotività è una pessima consigliera, quindi è fondamentale basare le proprie scelte   su dati oggettivi. Se non sono disponibili cercare di procurarseli. Quando si fanno delle  scelte importanti sul progetto motivarle e cercare di essere il più possibile transparenti.   La trasparenza è il primo tassello verso la fiducia. &lt;/p&gt;
&lt;p&gt;  &lt;span style="font-weight: bold;"&gt;Se un progetto va male potremmo esserne noi la causa&lt;/span&gt;, prima lo capiamo e prima potremo rimediare ai nostri   errori.  &lt;/p&gt;
&lt;p&gt;  Ho trovato molto istruttivo il &lt;a href="http://www.youtube.com/watch?v=vk5Jg-mAeVY"&gt;video&lt;/a&gt;  la cultura degli alibi. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97875.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/17/le-condizioni-per-avere-successo-nello-sviluppo-di-un-software.aspx</guid>
            <pubDate>Sun, 17 Jan 2010 10:24:05 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97875.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/17/le-condizioni-per-avere-successo-nello-sviluppo-di-un-software.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97875.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97875.aspx</trackback:ping>
        </item>
        <item>
            <title>Il blocco dello sviluppatore</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/11/il-blocco-dello-sviluppatore.aspx</link>
            <description>&lt;p&gt;&lt;img align="left" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/AntonioGanci/1890/o_blocco-dello-scrittore.jpg" alt="Il blocco dello scrittore" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;  Ho sperimentato empiricamente sui progetto in cui ho lavorato che &lt;strong&gt;l'attività di design incrementale procede ad   una velocità incostante&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;  Ci sono feature che riesco ad implementare velocemente e di cui sono soddisfatto del design ottenuto,  mentre ce ne sono altre in cui faccio molta fatica per implementarle e con poca soddisfazione del risultato. &lt;/p&gt;
&lt;p&gt;  Kent Beck suggerisce di rallentare quando si verificano queste situazioni di &lt;em&gt;attrito&lt;/em&gt;.  Rallentare significa procedere per passi sempre più piccoli fino a riuscire a superare  l'ostacolo. &lt;/p&gt;
&lt;p&gt;  Uno dei vantaggi del TDD è proprio quello di poter controllare la velocità: mi sento  confidente? Vado veloce. Mi sento poco confidente? Rallento. &lt;/p&gt;
&lt;p&gt;  Quando mi trovo in queste situazioni un'altra tecnica che trovo efficace è quella di risolvere  il problema in almeno due modi diversi. Sembra una perdita di tempo in realtà aumenta notevolmente  la conoscenza del sistema e spesso evidenzia limiti del design che altrimenti non si noterebbero  e che farebbero perdere molto più tempo in seguito. &lt;/p&gt;
&lt;p&gt;  Bisogna avere coraggio: se perdo confidenza nell'implementazione attuale è meglio fare   revert e rifare la feature su cui si sta lavorando altrimenti si rischia di aumentare eccessivamente  la complessità del sistema e di introdurre dei difetti. &lt;/p&gt;
&lt;p&gt;  Un'altra tecnica molto utile consiste nello spiegare cosa si sta facendo e quali problemi sto incontrando  ad un altro membro del team; oppure, se la soluzione è sufficientemente generica, scrivere un articolo  od un post sul proprio blog. &lt;/p&gt;
&lt;p&gt;  Trovo utile, banalmente, alzarmi dalla sedia fare quattro passi e ritornare a lavorare questo a volte  porta ad una buona intuizione che semplifica il design e lo rende più malleabile. &lt;/p&gt;
&lt;p&gt;  E a voi vi capitano questi blocchi? Cosa fate per risolverli? &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97829.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/11/il-blocco-dello-sviluppatore.aspx</guid>
            <pubDate>Mon, 11 Jan 2010 09:25:23 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97829.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/11/il-blocco-dello-sviluppatore.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97829.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97829.aspx</trackback:ping>
        </item>
        <item>
            <title>Feedback sul workshop design emergente</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/09/feedback-sul-workshop-design-emergente.aspx</link>
            <description>&lt;p&gt;  Come avevo scritto nel mio precedente   &lt;a href="http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/03/investire-sulla-formazione-personale.aspx"&gt;post&lt;/a&gt;  ho partecipato al workshop sul   &lt;a href="http://www.metodiagili.it/formazione/workshop-design-emergente/index.html"&gt;design emergente&lt;/a&gt;  tenuto da Francesco Cirillo &lt;/p&gt;
&lt;p&gt;  Il concetto più importante che ho appreso è il seguente:   &lt;strong&gt;quando si fa design focalizzarsi sul comportamento del sistema piuttosto che sulla struttura.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;  Cosa significa? &lt;/p&gt;
&lt;p&gt;  Partiamo da due rappresentazioni UML: class diagram e collaboration diagram. &lt;/p&gt;
&lt;p&gt;  Il class diagram è una rappresentazione della struttura delle classi, una rappresentazione statica  che mal rappresenta il comportamento del sistema. Quindi se uso il class diagram per disegnare l'architettura  del sistema risulterà &lt;strong&gt;poco tollerante ai cambiamenti, rigido&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;  Il collaboration diagram schematizza l'interazione tra gli oggetti. Vengono rappresentati i messaggi  che si scambiano ed in questo modo si può rappresentare il comportamento del sistema a partire da uno  scenario. Esempio di scenario: aggiunta di un prodotto al carrello. &lt;/p&gt;
&lt;p&gt;  Un esempio di collaboriation diagram lo trovate in questo   &lt;a href="http://www.objectmentor.com/resources/articles/umlCollaborationDiagrams.pdf"&gt;articolo&lt;/a&gt;,  mentre un software open source per disegnarli è   &lt;a href="http://staruml.sourceforge.net/en/"&gt;starUML&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;  Un approccio classico della programmazione ad oggetti è quella di creare oggetti che modellano il mondo reale  ad esempio un software per la gestione del tornello di una metropolitana avrà gli oggetti tornello, biglietto,  ecc. Questo rende poco riutilizzabile il codice perchè è legato al particolare problema  che si sta risolvendo, invece, se gli oggetti rappresentano il comportamento il sistema risulta  maggiormente malleabile ai cambiamenti. &lt;/p&gt;
&lt;p&gt;  Sono soddisfatto quindi di aver partecipato al corso perchè quello che ho illustrato secondo me è  un concetto molto importante, che migliora il modo di scrivere codice. Quello che mi ha un pò deluso  è l'assistenza post corso, Francesco non ha risposto alle domande che gli abbiamo inviato via mail. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97822.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/09/feedback-sul-workshop-design-emergente.aspx</guid>
            <pubDate>Sat, 09 Jan 2010 08:33:12 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97822.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2010/01/09/feedback-sul-workshop-design-emergente.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97822.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97822.aspx</trackback:ping>
        </item>
        <item>
            <title>Binding di dati ad una lista sviluppato utilizzando il TDD parte seconda</title>
            <category>Extreme Programming</category>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd-again.aspx</link>
            <description>&lt;p&gt;  Leggi la prima parte &lt;a href="http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd.aspx"&gt;qui&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;  Scelgo le ultime due colonne da cui partire per la valorizzazione in quanto sono le più semplici,  infatti, ho un valore per ogni titolarità. &lt;/p&gt;
&lt;p&gt;  Abbiamo bisogno di: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Creare le colonne Rendita e Valore&lt;/li&gt;
    &lt;li&gt;Mappare le colonne con i campi RenditaCatastale e ValoreFabbricato della classe Titolarita&lt;/li&gt;
    &lt;li&gt;Formattare il numero come 1.000,00&lt;/li&gt;
    &lt;li&gt;Aggiungere una riga per ogni Titolarita&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  Partiamo dalla grid. L'implementazione attuale è la seguente e non fa ancora nulla: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Cell&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;this&lt;/span&gt;[&lt;span style="color: rgb(128, 128, 192);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;row&lt;/span&gt;, &lt;span style="color: rgb(128, 128, 192);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;col&lt;/span&gt;] { &lt;span style="color: rgb(128, 128, 192);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(128, 128, 192);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;null&lt;/span&gt;; } }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;ColumnHeader&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ColumnHeaders&lt;/span&gt; { &lt;span style="color: rgb(128, 128, 192);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(128, 128, 192);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;null&lt;/span&gt;; } }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Come griglia userò una ListView alla quale dobbiamo impostare alcune  property per farla funzionare come una grid: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;La prima colonna la facciamo invisibile in quanto si comporta diversamente dalle altre  come documentato nelle msdn   &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.columnheader.textalign.aspx"&gt;qui&lt;/a&gt;.  In pratica viene ignorato il text align nella prima colonna.  &lt;/li&gt;
    &lt;li&gt;Dobbiamo settare la DetailsView&lt;/li&gt;
    &lt;li&gt;Dobbiamo visualizzare le righe&lt;/li&gt;
    &lt;li&gt;La selezione deve coprire tutte le celle di una riga&lt;/li&gt;
    &lt;li&gt;dobbiamo poter aggiungere colonne e celle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  Ecco il test per l'inizializzazione della grid: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldInitializeListView&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Columns&lt;/span&gt;[0].&lt;span style="color: rgb(254, 241, 169);"&gt;Width&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(0));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;View&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(199, 199, 241);"&gt;View&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Details&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;FullRowSelect&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;True&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;GridLines&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;True&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Farlo passare è banale: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;View&lt;/span&gt; = &lt;span style="color: rgb(199, 199, 241);"&gt;View&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Details&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Columns&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;""&lt;/span&gt;).&lt;span style="color: rgb(254, 241, 169);"&gt;Width&lt;/span&gt; = 0;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;FullRowSelect&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;GridLines&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Aggiungiamo la possibilità di creare colonne: &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldAppendColumnToListView&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendColumn&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"title"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Columns&lt;/span&gt;[1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"title"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Aggiungiamo una riga vuota: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldAppendRowWithoutCells&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendEmptyRow&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Items&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Count&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(1));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Ed ora una cella: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldAppendCellToTheLastRow&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendEmptyRow&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendCell&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"some text"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;m_listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Items&lt;/span&gt;[0].&lt;span style="color: rgb(254, 241, 169);"&gt;SubItems&lt;/span&gt;[1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"some text"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  A questo punto abbiamo bisogno di un data component processor che aggiunga una riga per ogni  titolarità: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldAppendRowToTheGrid&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;RowAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;&amp;gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Items&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Count&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(1));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Formattiamo il numero decimale: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldFomatValue&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;money&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;(1234.56M);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;string&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;formatted&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;money&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Format&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;formatted&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"1.234,56"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Ci siamo quasi, manca ora un oggetto che prenda il valore del campo e lo formatti: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;        [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldAppendCellFormattingComponentValue&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;ListView&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendEmptyRow&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;CellAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;RenditaCatastale&lt;/span&gt;), &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt; {&lt;span style="color: rgb(254, 241, 169);"&gt;RenditaCatastale&lt;/span&gt; = 1000M});&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;listView&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Items&lt;/span&gt;[0].&lt;span style="color: rgb(254, 241, 169);"&gt;SubItems&lt;/span&gt;[1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"1.000,00"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Di questo riporto anche l'implementazione perchè forse non risulta ovvia: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;CellAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TComponent&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;TData&lt;/span&gt;&amp;gt; : &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TComponent&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TComponent&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;TData&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_getValueFunc&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;CellAppenderComponentProcessor&lt;/span&gt;(&lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TComponent&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;TData&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;func&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_getValueFunc&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;func&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;TComponent&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;dataComponet&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;TData&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;data&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;m_getValueFunc&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Invoke&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;dataComponet&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendCell&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;data&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ToString&lt;/span&gt;());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Ora è il momento di mettere tutti i pezzi insieme: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;m_fabbricatiListView&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Initialize&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendColumn&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"Rendita catastale"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;AppendColumn&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"Valore fabbricato"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;praticaProcessor&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricato&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricato&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Titolarita&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;MultiComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;RowAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;&amp;gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;CellAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;RenditaCatastale&lt;/span&gt;), &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;CellAppenderComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Money&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;titolarita&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ValoreFabbricato&lt;/span&gt;), &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;))));&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Avendo la necessità eseguire più Processor ho creato la classe MultiComponentProcessor: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;MultiComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;T&lt;/span&gt;&amp;gt; : &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;T&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;T&lt;/span&gt;&amp;gt;[] &lt;span style="color: rgb(254, 241, 169);"&gt;m_processors&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;MultiComponentProcessor&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;params&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;T&lt;/span&gt;&amp;gt;[] &lt;span style="color: rgb(254, 241, 169);"&gt;processors&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_processors&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;processors&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;T&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;dataComponet&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_processors&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: rgb(254, 241, 169);"&gt;processor&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;dataComponet&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  La costruzione degli oggetti che ho scritto sopra non è forse leggibilissima, ma il problema si può  risolvere facilmente creando un oggetto Builder con una fluent interface. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97783.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd-again.aspx</guid>
            <pubDate>Wed, 30 Dec 2009 15:26:24 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97783.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd-again.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97783.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97783.aspx</trackback:ping>
        </item>
        <item>
            <title>Binding di dati ad una lista sviluppato utilizzando il TDD</title>
            <category>Extreme Programming</category>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd.aspx</link>
            <description>&lt;p&gt;  Devo riempire una grid con i seguenti dati: &lt;/p&gt;
&lt;p&gt;  &lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/AntonioGanci/1890/o_ListaFabbricati%282%29.png" alt="Lista fabbricati" /&gt; &lt;/p&gt;
&lt;p&gt;  La quale rappresenta un esempio di una lista di fabbricati di una pratica ICI.  Ogni riga rappresenta la titolarità di un fabbricato quindi sono rappresentati tre fabbricati di  cui il primo con due titolarita. &lt;/p&gt;
&lt;p&gt;  Come vediamo la rappresentazione dei dati ha un pò di logica ad esempio la prima colonna ha due formattazioni  diverse in base ad un valore booleano, poi dalla seconda colonna i dati legati al fabbricato vengono  ripetuti se ci sono diverse titolarità ed infine ci sono alcuni importi da visualizzare. &lt;/p&gt;
&lt;p&gt;  Vediamo la parte di dominio legata ai dati della lista: &lt;/p&gt;
&lt;p&gt;  &lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/AntonioGanci/1890/o_FabbricatiClassDiagram.png" alt="Fabbricati class diagram" /&gt; &lt;/p&gt;
&lt;p&gt;  Come si vede abbiamo due relazioni uno a molti: Pratica -&amp;gt; Fabbricati e Fabbricato -&amp;gt; Titolarita. &lt;/p&gt;
&lt;p&gt;  Partiamo dal setup del test di accettazione (per chi non lo sapesse un test di accettazione è  un test end to end, cioè testa la feature con tutti i componenti): &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: rgb(199, 199, 241);"&gt;SetUp&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;SetUp&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricatoMilano&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;      {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;Verificato&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;true&lt;/span&gt;, &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;Progressivo&lt;/span&gt; = 1, &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;Comune&lt;/span&gt; = &lt;span style="color: rgb(96, 255, 96);"&gt;"Milano"&lt;/span&gt;, &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;Indirizzo&lt;/span&gt; = &lt;span style="color: rgb(96, 255, 96);"&gt;"Viale Roma"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;      };&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricatoMilano&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Titolarita&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;{ &lt;span style="color: rgb(254, 241, 169);"&gt;RenditaCatastale&lt;/span&gt; = 180.76M, &lt;span style="color: rgb(254, 241, 169);"&gt;ValoreFabbricato&lt;/span&gt; = 18980.70M });&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricatoMilano&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Titolarita&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;{ &lt;span style="color: rgb(254, 241, 169);"&gt;RenditaCatastale&lt;/span&gt; = 93.02M, &lt;span style="color: rgb(254, 241, 169);"&gt;ValoreFabbricato&lt;/span&gt; = 8950.20M });&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;fabbricatoMilano&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;  ...&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Ho messo solo il primo per leggibilità. Vediamo il codice del test ora:&lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldFillFabbricatiGrid&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Grid&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;FabbricatiGridFiller&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;filler&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;FabbricatiGridFiller&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;filler&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fill&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ColumnHeaders&lt;/span&gt;[0].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"Verif."&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[0, 0].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"SI"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[0, 0].&lt;span style="color: rgb(254, 241, 169);"&gt;BackColor&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(199, 199, 241);"&gt;Color&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;LightGreen&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[0, 0].&lt;span style="color: rgb(254, 241, 169);"&gt;FontStyle&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(199, 199, 241);"&gt;FontStyle&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Bold&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[1, 0].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Empty&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ColumnHeaders&lt;/span&gt;[1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"Progr."&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[0, 1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"1"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;grid&lt;/span&gt;[1, 1].&lt;span style="color: rgb(254, 241, 169);"&gt;Text&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(96, 255, 96);"&gt;"1"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Ho riportato solo una parte delle Assert, ma il concetto spero sia chiaro. &lt;/p&gt;
&lt;p&gt;  A questo punto facciamo compilare il codice del test creando delle classi senza implementazione,  che non riporto. &lt;/p&gt;
Il motivo per cui sono partito dal test di accettazione sta nel fatto che mi mi &lt;span style="font-weight: bold;"&gt;chiarisce l'obiettivo   a cui devo arrivare&lt;/span&gt;, ma  ora utilizzerò il TDD per arrivare all'implementazione della feature.  Quindi non preoccupatevi in questo test non ho usato nessun  &lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;Big Design Up Front (BDUF)&lt;/a&gt;.
&lt;p&gt;  Qual è il prossimo passo?  &lt;/p&gt;
&lt;p&gt;  Per rispondere a questa domanda definiamo il principio che vogliamo che il nostro design debba rispettare.  Nel mio caso specifico ho molte liste da riempire simili a questa i cui dati sono memorizzati in classi  analoghe a Fabbricato, Titolarita ecc. &lt;span style="font-weight: bold;"&gt;Quindi voglio descrivere il binding  dei dati senza dipendere dai dati stessi&lt;/span&gt;. Inoltre non voglio utilizzare la reflection, ma un grafo di oggetti  che collaborino tra loro per ottenere il risultato. &lt;/p&gt;
&lt;p&gt;   Partirò dalla relazione tra gli oggetti che contengono i dati (Pratica, Fabbricato,  Titolarita). Come si può vedere sono due relazioni uno a molti la prima tra Pratica e Fabbricato, la seconda  tra Fabbricato e Titolarita. &lt;/p&gt;
&lt;p&gt;  Come chiamiamo questo oggetto? OneToManyDataComponentRelation. Gli oggetti come Fabbricato li ho battezzati  DataComponent e sono oggetti solitamente mappati con una tabella e che mi arrivano da un ORM di vostra scelta. &lt;/p&gt;
&lt;p&gt;  Vediamo il test: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldProcessRelatedComponents&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessor&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;this&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;relation&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessor&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(254, 241, 169);"&gt;relation&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ProcessRelatedComponents&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessedCount&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(2));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Se vediamo il codice della classe penso che risulterà più semplice la comprensione del test: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;OneToManyDataComponentRelation&lt;/span&gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;getRelatedComponentsFunc&lt;/span&gt;, &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;relatedComponentProcessor&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;getRelatedComponentsFunc&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;relatedComponentProcessor&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ProcessRelatedComponents&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;dataComponent&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;components&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Invoke&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;dataComponent&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;component&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;components&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;component&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  In pratica ho definito una relazione uno a molti tra due tipi in questo Caso Pratica e Fabbricato.  E per ogni link della relazione viene eseguito il metodo process dell'interfaccia IDataComponent. &lt;/p&gt;
&lt;p&gt;  Un'altra cosa interessante è l'inizializzazione del data processor a this e cioè alla  classe di test. Questa tecnica si chiama  &lt;a href="http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf"&gt;Self Shunt&lt;/a&gt;  ed è utile quando il test di interazione è molto semplice. Vediamo la classe di test al completo: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: rgb(199, 199, 241);"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelationTests&lt;/span&gt; : &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessedCount&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    [&lt;span style="color: rgb(199, 199, 241);"&gt;SetUp&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;SetUp&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessedCount&lt;/span&gt; = 0;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Add&lt;/span&gt;(&lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    [&lt;span style="color: rgb(199, 199, 241);"&gt;Test&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;ShouldProcessRelatedComponents&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessor&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;this&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;relation&lt;/span&gt; = &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessor&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;relation&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;ProcessRelatedComponents&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;praticaIci&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessedCount&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;EqualTo&lt;/span&gt;(2));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;dataComponet&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;componentProcessedCount&lt;/span&gt;++;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Ora una cosa che mi piacerebbe è di poter concatenare le relazioni. &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Pratica&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;pratica&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Fabbricati&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(199, 199, 241);"&gt;Fabbricato&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;Titolarita&lt;/span&gt;&amp;gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricato&lt;/span&gt; =&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;fabbricato&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Titolarita&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(128, 128, 192);"&gt;...&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Per ottenere questo risultato basta semplicemente far implementare l'interfaccia IDataComponentProcessor  alla nostra relation: &lt;/p&gt;
&lt;div style="background: rgb(24, 24, 24) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(224, 224, 224); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;OneToManyDataComponentRelation&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; : &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;OneToManyDataComponentRelation&lt;/span&gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt;, &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;getRelatedComponentsFunc&lt;/span&gt;, &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;IDataComponentProcessor&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;relatedComponentProcessor&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;getRelatedComponentsFunc&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;relatedComponentProcessor&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: rgb(128, 128, 192);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;TOne&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;dataComponent&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(199, 199, 241);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(254, 241, 169);"&gt;TMany&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(254, 241, 169);"&gt;components&lt;/span&gt; = &lt;span style="color: rgb(254, 241, 169);"&gt;m_getRelatedComponentsFunc&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Invoke&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;dataComponent&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: rgb(128, 128, 192);"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(128, 128, 192);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;component&lt;/span&gt; &lt;span style="color: rgb(128, 128, 192);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(254, 241, 169);"&gt;components&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: rgb(254, 241, 169);"&gt;m_relatedComponentProcessor&lt;/span&gt;.&lt;span style="color: rgb(254, 241, 169);"&gt;Process&lt;/span&gt;(&lt;span style="color: rgb(254, 241, 169);"&gt;component&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;  Scriverò un altro post per la parte rimanente. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97780.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd.aspx</guid>
            <pubDate>Wed, 30 Dec 2009 09:10:17 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97780.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/30/binding-di-dati-ad-una-lista-sviluppato-utilizzando-il-tdd.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97780.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97780.aspx</trackback:ping>
        </item>
        <item>
            <title>TDD Productivity Plugin for Resharper</title>
            <category>Extreme Programming</category>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/04/tdd-productivity-plugin-for-resharper.aspx</link>
            <description>&lt;p&gt;  Una cosa fastidiosa nell'usare il TDD con Visual Studio è la mancanza di strumenti   pensati per chi scrive i test prima del codice. &lt;/p&gt;
&lt;p&gt;  ReSharper risolve parzialmente il problema; ad esempio quando da un test creiamo la classe sotto test  viene creata nello stesso file. Si può spostare in un altro file, ma rimane nel progetto  di test.  &lt;/p&gt;
&lt;p&gt;  Cercando in rete ho trovato un plugin di resharper che ovvia al problema:  &lt;a href="http://code.google.com/p/resharper-tdd-productivity-plugin/"&gt;TDD Productivity Plugin for Resharper&lt;/a&gt;.  Si installa tramite un setupkit ed è compatibile con le versioni 4.5 e 4.1 &lt;/p&gt;
&lt;p&gt;  Ho provato da una classe di test con &lt;span style="font-style: italic;"&gt;alt + enter&lt;/span&gt; ad usare l'azione Create Class e la classe è  stata creata nel progetto referenziato. Molto comodo! &lt;/p&gt;
&lt;p&gt;  Spero che possa tornare utile anche a voi. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97663.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/04/tdd-productivity-plugin-for-resharper.aspx</guid>
            <pubDate>Fri, 04 Dec 2009 15:40:35 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97663.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/12/04/tdd-productivity-plugin-for-resharper.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97663.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97663.aspx</trackback:ping>
        </item>
        <item>
            <title>Videogiochi indie con un alto valore artistico</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/06/videogiochi-indie-con-un-alto-valore-artistico.aspx</link>
            <description>&lt;p&gt;  Le   &lt;a href="http://blogs.ugidotnet.org/luKa/archive/2009/10/03/space-monkey-processing.aspx"&gt;prodezze&lt;/a&gt;  di Luka con &lt;a href="http://processing.org/"&gt;processing&lt;/a&gt; hanno ispirato questo post. &lt;/p&gt;
&lt;p&gt;  Ci sono videogiochi nel panorama indie in cui il lato artistico è particolarmente curato, e   l'abilità del giocatore è secondaria rispetto l'esperienza di gioco. &lt;/p&gt;
&lt;p&gt;  A questo propostito vi segnalo: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;   &lt;strong&gt;The Path&lt;/strong&gt; videogioco horror basato principalmente sull'esplorazione (maggiori info   &lt;a href="http://tale-of-tales.com/ThePath/"&gt;qui&lt;/a&gt;).  &lt;/li&gt;
    &lt;li&gt;   &lt;strong&gt;Windosill&lt;/strong&gt; videogioco flash basato sull'interazione con l'ambiente (maggiori info   &lt;a href="http://windosill.com/"&gt;qui&lt;/a&gt;).  &lt;/li&gt;
    &lt;li&gt;   &lt;strong&gt;Machinarium&lt;/strong&gt; bellissima l'ambientazione post-apocalitica (maggiori info   &lt;a href="http://machinarium.net/"&gt;qui&lt;/a&gt;).  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  Sono lavori che hanno dietro un piccolo gruppo di sviluppatori appassionati, che  ritengo meritevoli di essere supportati con l'acquisto di una licenza, molto economica  rispetto a titoli più blasonati. &lt;/p&gt;
&lt;p&gt;  Se ne avete qualcuno da segnalare scrivetelo nei commenti che l'aggiungo alla lista. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97193.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/06/videogiochi-indie-con-un-alto-valore-artistico.aspx</guid>
            <pubDate>Tue, 06 Oct 2009 17:00:23 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97193.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/06/videogiochi-indie-con-un-alto-valore-artistico.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97193.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97193.aspx</trackback:ping>
        </item>
        <item>
            <title>Investire sulla formazione personale</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/03/investire-sulla-formazione-personale.aspx</link>
            <description>&lt;img alt="libri" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/AntonioGanci/1890/o_books.jpg" /&gt;
&lt;p&gt;  Ho deciso di iscrivermi al workshop sul   &lt;a href="http://www.metodiagili.it/formazione/workshop-design-emergente/index.html"&gt;design emergente&lt;/a&gt;  che verrà tenuto da Francesco Cirillo.  &lt;/p&gt;
&lt;p&gt;  A convincermi è stato &lt;a href="http://matteo.vaccari.name/"&gt;Matteo&lt;/a&gt; che ne parla nel suo  &lt;a href="http://matteo.vaccari.name/blog/archives/187"&gt;blog&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;  Ho inoltre acquistato e letto il libro &lt;a href="http://www.artofunittesting.com/"&gt;The art of unit testing&lt;/a&gt;. &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Dalla sezione &lt;em&gt;Avoiding overspecification in tests&lt;/em&gt; ho imparato che tendo ad abusare degli oggetti  mock anche quando sarebbero sufficienti degli stub.  &lt;/p&gt;
&lt;p&gt;  Lo scopo di questo post è di spronare chi fa questo mestiere ad &lt;span style="font-weight: bold;"&gt;investire sulla propria  professionalità e sulla propria tecnica nello scrivere codice&lt;/span&gt;. &lt;/p&gt;
&lt;p&gt;  Purtroppo ho visto diverse volte sviluppatori software con decenni di esperienza non conoscere  i concetti più elementari di OOP come l'  &lt;a href="http://en.wikipedia.org/wiki/Information_hiding"&gt;information hiding&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97168.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/03/investire-sulla-formazione-personale.aspx</guid>
            <pubDate>Sat, 03 Oct 2009 12:07:35 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97168.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/10/03/investire-sulla-formazione-personale.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97168.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97168.aspx</trackback:ping>
        </item>
        <item>
            <title>Contratti Fixed Price Fixed Length Fixed Scope</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/09/06/contratti-fixed-price-fixed-length-fixed-scope.aspx</link>
            <description>&lt;p&gt;   Ho visto che è una tendenza diffusa da parte del cliente di preferire contratti a scadenza fissa, budget fisso e scope fisso.   In pratica è come se stessi dicendo alla software house che lo svilupperà: fammi questo software    con queste funzionalità entro tale data. &lt;/p&gt;
&lt;p&gt;   Il motivo credo sia soprattutto ingenuità e mancanza di fiducia con l'illusione che un contratto blindato   possa garantire il risultato. &lt;/p&gt;
&lt;p&gt;   Nella pratica succede, che alla fine entrambi gli attori in gioco ci rimettono:   la software house è costretta a gonfiare le stime ed essere molto pignola nelle specifiche,   il cliente avrà poco controllo perchè ogni richiesta diversa da quella iniziale dovrà   essere rinegoziata. &lt;/p&gt;
&lt;p&gt;   &lt;em&gt;Ma perchè viene quindi preferito rispetto ad altri tipi di contratti?&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;   Perchè ha due grossi vantaggi: è facile da capire e soprattutto &lt;strong&gt;è facile da confrontare&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;   Le aziende spesso hanno un ufficio acquisti che non ha competenze tecniche e quindi quei due vantaggi possono   essere fondamentali. &lt;/p&gt;
&lt;p&gt;   &lt;em&gt;Come potremmo mitigarne gli svantaggi?&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;   Se possibile ridurre la durata del contratto e il numero di funzionalità il più possibile.   In modo da ridurre i rischi. &lt;/p&gt;
&lt;p&gt;   &lt;em&gt;Quali contratti alternativi posso proporre?&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;   Il concetto di base è che una o più variabili in gioco (tempo, scope, feature) siano variabili.   Qualche link per approfonfire l'argomento: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://alistair.cockburn.us/Agile+contracts"&gt;Agile contracts&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://blog.obiefernandez.com/content/2009/02/explain-variable-scope-with-ponies.html"&gt;Explain Variable Scope with Ponies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  I link mi erano stati segnalati da &lt;a href="http://matteo.vaccari.name/blog"&gt;Matteo&lt;/a&gt; e &lt;a href="http://xplayer.wordpress.com/"&gt;Piero&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;  Vi ritrovate in questa descrizione? O riuscite a fare contratti piuttosto flessibili? &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/97003.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/09/06/contratti-fixed-price-fixed-length-fixed-scope.aspx</guid>
            <pubDate>Sun, 06 Sep 2009 08:15:24 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/97003.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/09/06/contratti-fixed-price-fixed-length-fixed-scope.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/97003.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/97003.aspx</trackback:ping>
        </item>
        <item>
            <title>Schema-less Databases</title>
            <link>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/04/28/schema-less-databases.aspx</link>
            <description>&lt;p&gt;
	&lt;a href="http://jfranzoi.wordpress.com/"&gt;Jacopo&lt;/a&gt; mi ha segnalato questo &lt;a href="http://bret.appspot.com/entry/how-friendfeed-uses-mysql"&gt;post&lt;/a&gt;,
	in cui viene spiegato come FriendFeed memorizza su un database MySQL dati schema-less. 
&lt;/p&gt;
&lt;p&gt;
	L'idea è quella di memorizzare una versione serializzata delle nostre entities, nel caso di FriendFeed in formato &lt;a href="http://www.json.org/example.html"&gt;JSON&lt;/a&gt;.
	La tabella ha la seguente struttura:
&lt;/p&gt;
&lt;code&gt;
&lt;pre&gt;
CREATE TABLE entities (
    added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    id BINARY(16) NOT NULL,
    updated TIMESTAMP NOT NULL,
    body MEDIUMBLOB,
    UNIQUE KEY (id),
    KEY (updated)
) ENGINE=InnoDB;
&lt;/pre&gt;
&lt;/code&gt;
&lt;p&gt;
	La cosa, che trovo, interessante è la motivazione che ha spinto ad adottare tale struttura cito dal post:
&lt;/p&gt;
&lt;p&gt;
&lt;cite&gt;
	As our database has grown, we have tried to iteratively deal with the scaling issues that come with rapid growth. We did the typical things, like using read slaves and memcache to increase read throughput and sharding our database to improve write throughput. However, as we grew, &lt;b&gt;scaling our existing features to accomodate more traffic turned out to be much less of an issue than adding new features.&lt;/b&gt; 
&lt;/cite&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;cite&gt;
	In particular, making schema changes or adding indexes to a database with more than 10 - 20 million rows completely locks the database for hours at a time. Removing old indexes takes just as much time, and not removing them hurts performance because the database will continue to read and write to those unused blocks on every INSERT, pushing important blocks out of memory.
&lt;/cite&gt;
&lt;/p&gt;
&lt;p&gt;
	Ayende ne parla nel post &lt;a href="http://ayende.com/Blog/archive/2009/03/17/designing-a-document-database-what-next.aspx"&gt;Designing a document database: What next?&lt;/a&gt; ed
	esiste anche un'implementazione open source chiamata &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
	Questa idea è un'eventuale alternativa ai classici database relazionali, nel caso in cui ci si trovi in condizioni analoghe.
&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/AntonioGanci/aggbug/96062.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Antonio Ganci</dc:creator>
            <guid>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/04/28/schema-less-databases.aspx</guid>
            <pubDate>Tue, 28 Apr 2009 12:39:41 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/AntonioGanci/comments/96062.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/AntonioGanci/archive/2009/04/28/schema-less-databases.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/AntonioGanci/comments/commentRss/96062.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/AntonioGanci/services/trackbacks/96062.aspx</trackback:ping>
        </item>
    </channel>
</rss>