<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>ema.blog</title>
	
	<link>http://blog.codiceplastico.com/ema</link>
	<description>Clean coder</description>
	<lastBuildDate>Fri, 23 Mar 2012 14:32:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blogema" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="blogema" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Back to basic: TDD (4)</title>
		<link>http://blog.codiceplastico.com/ema/?p=342</link>
		<comments>http://blog.codiceplastico.com/ema/?p=342#comments</comments>
		<pubDate>Fri, 23 Mar 2012 14:32:14 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=342</guid>
		<description><![CDATA[Continua la serie, per piccoli passi. La storia che implementiamo oggi è la seguente: Dato un carrello posso sapere il prezzo totale degli articoli presenti. Da un po&#8217; di analisi emerge che il prezzo degli articoli è una cosa che cambia spesso anche per eventuali promozioni, saldi, ecc&#8230;quindi nasce l&#8217;esigenza di un servizio che si [...]]]></description>
			<content:encoded><![CDATA[<p>Continua la serie, per piccoli passi.</p>
<p>La storia che implementiamo oggi è la seguente:</p>
<p><em>Dato un carrello posso sapere il prezzo totale degli articoli presenti.</em></p>
<p>Da un po&#8217; di analisi emerge che il prezzo degli articoli è una cosa che cambia spesso anche per eventuali promozioni, saldi, ecc&#8230;quindi nasce l&#8217;esigenza di un servizio che si occupa dato un articolo di restituire il prezzo corrente (se questo non emergesse subito, no prob, si potrà fare refactoring in futuro).</p>
<p>Come al solito partiamo da un test per ragionare un po&#8217;. Quello che voglio è che l&#8217;oggetto CartItem utilizzi un servizio per sapere il prezzo del&#8217;articolo aggiunto, detto in C#:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> GetTotal_OneItem_ShouldAskToPriceListServiceTheItemPrice<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var priceListService <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Mock<span style="color: #008000;">&lt;</span>IPriceListService<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span>priceListService<span style="color: #008000;">.</span><span style="color: #6666cc; font-weight: bold;">Object</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; priceListService<span style="color: #008000;">.</span><span style="color: #0000FF;">Verify</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentPriceFor</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Questo test è diverso da quelli scritti fin&#8217;ora. Prima di tutto viene usato un mock object (priceListService) invece del vero oggetto in modo da avere uno unit test nonostante le dipendenze e poi non vengono fatte asserzioni sullo stato ma sulla collaborazione tra l&#8217;oggetto CartItem e il servizio.</p>
<p>Questo tipo di test si chiamano test di interazione a differenza di quelli fatti fino ad ora che erano test di stato. I test d&#8217;interazione verificano che 2 o più oggetti collaborino in modo corretto chiamando i giusti metodi con i giusti parametri. Nel nostro caso vado a verificare che il metodo GetCurrentPriceFor venga chiamato con il valore 99, se ciò avviene il test passa altrimenti fallisce. Non mi interessa lo stato dell&#8217;oggetto CartItem tant&#8217;è che non faccio alcuna asserzione su di esso.</p>
<p>La cosa interessante è che nel test sopra sto introducendo una nuova classe della quale vado a definire la competenza e parte dell&#8217;interfaccia ma non mi occupo dell&#8217;implementazione che demando in un secondo momento.</p>
<p>Il test è definito quindi posso passare alla fase rossa. Per compilare aggiunto al costruttore di ShoppingCart il parametro di tipo IPriceListService, aggiungo l&#8217;interfaccia e il test è già rosso.</p>
<p>Il messaggio di errore mi dice che il metodo GetCurrentPriceFor non è stato chiamato correttamente, quindi l&#8217;interazione prevista tra ShoppingCart e il servizio non è avvenuta. Per farlo diventare verde aggiungo in fondo al metodo AddItem la seguente riga di codice (_priceListService è l&#8217;istanza del servizio passata a ShoppingCart):</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">_priceListService<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentPriceFor</span><span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p>Il test d&#8217;interazione è verde ma la storia non è ancora completa, quello che chiedeva era di esporre il prezzo totale degli articoli del carrello, quindi devo esporre una proprietà che mostri il prezzo calcolato tramite il servizio. Aggiungo un test:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> GetTotal_OneItem_ShouldSetTheTotalValue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var priceListService <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Mock<span style="color: #008000;">&lt;</span>IPriceListService<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span>priceListService<span style="color: #008000;">.</span><span style="color: #6666cc; font-weight: bold;">Object</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; priceListService<span style="color: #008000;">.</span><span style="color: #0000FF;">Setup</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentPriceFor</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Returns</span><span style="color: #008000;">&#40;</span>100m<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; Assert<span style="color: #008000;">.</span><span style="color: #0000FF;">Equal</span><span style="color: #008000;">&#40;</span>100m, _cart<span style="color: #008000;">.</span><span style="color: #0000FF;">Total</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Questo test sebbene simile al precedente torna a valutare lo stato dell&#8217;oggetto indipendentemente dalla collaborazione con il servizio. Ho aggiunto un test perché rispetto al precedente sto testando un&#8217;altra cosa sebbene nel contesto della stessa storia.</p>
<p>Da notare che in questo test l&#8217;oggetto priceListService funziona da Stub e non da Mock (non verifica la collaborazione ma risponde  con il valore 100 ad ogni chiamata del metodo).</p>
<p>Al momento il test è rosso, quindi modifico il metodo AddItem nel seguente modo:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; CartItem item <span style="color: #008000;">=</span> _items<span style="color: #008000;">.</span><span style="color: #0000FF;">SingleOrDefault</span><span style="color: #008000;">&#40;</span>i <span style="color: #008000;">=&gt;</span> i<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span> <span style="color: #008000;">==</span> itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>item <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; item<span style="color: #008000;">.</span><span style="color: #0000FF;">AddOne</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">else</span><br />
&nbsp; &nbsp; _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> CartItem<span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; Total <span style="color: #008000;">=</span> _priceListService<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentPriceFor</span><span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Come vedete ho fatto un piccolo passo, al posto di = avrei potuto scrivere direttamente un +=. Vi invito a non fare passi troppo lunghi e a cercare di soddisfare sempre solo ciò che il test richiede.</p>
<p>Per arrivare all&#8217;implementazione finale e completare la storia basterà aggiungere un altro test che aggiunge 2 item e che verifica che il totale sia la somma dei prezzi. Per questo vi rimando al sorgente presente sul <a target="_blank" href="https://github.com/emadb/TddSerie/">repo</a> per non allungare troppo questo post.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/63rh6V0GJR4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=342</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back to basic: TDD (3)</title>
		<link>http://blog.codiceplastico.com/ema/?p=321</link>
		<comments>http://blog.codiceplastico.com/ema/?p=321#comments</comments>
		<pubDate>Mon, 12 Mar 2012 10:57:00 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=321</guid>
		<description><![CDATA[Nei primi 2 step abbiamo introdotto una piccola funzionalità che permette di aggiungere un articolo al carrello. Continuiamo sullo stesso tema introducendo la seguente funzionalità: Quando aggiungo 2 item uguali, deve aumentare la quantità dell&#8217;item. Nello step 2 abbiamo gestito l&#8217;aggiunta dello stesso articolo per 2 volte oggi gestiamo la quantità e questo ci porta [...]]]></description>
			<content:encoded><![CDATA[<p>Nei primi 2 step abbiamo introdotto una piccola funzionalità che permette di aggiungere un articolo al carrello. Continuiamo sullo stesso tema introducendo la seguente funzionalità:</p>
<p><em>Quando aggiungo 2 item uguali, deve aumentare la quantità dell&#8217;item.</em></p>
<p>Nello step 2 abbiamo gestito l&#8217;aggiunta dello stesso articolo per 2 volte oggi gestiamo la quantità e questo ci porta alla creazione di una nuova classe che rappresenta l&#8217;articolo aggiunto.<br />
Proviamo a scrivere un test per decidere l&#8217;interfaccia che vogliamo usare e come vogliamo operare:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddSameItemTwice_TheItemQuantityShouldBe2<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> CartItem<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> CartItem<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Assert<span style="color: #008000;">.</span><span style="color: #0000FF;">Equal</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">2</span>, cart<span style="color: #008000;">.</span><span style="color: #0000FF;">Items</span><span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Questa implementazione non mi piace molto perché ci costringe a sapere dell&#8217;esistenza della classe CartItem che al momento non serve se non per gestire la quantità. Inoltre è meglio non esporre pubblicamente la lista dei CartItem altrimenti si potrebbero aggiungere item senza passare dal metodo AddItem o si potrebbero fare operazioni non consentite.</p>
<p>Quindi modifico il test per nascondere l&#8217;esistenza di CartItem e per esporlo sotto forma di IEnumerable cosi che la collezione non sia modificabile ma sia in sola lettura.</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddSameItemTwice_TheItemQuantityShouldBe2<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Assert<span style="color: #008000;">.</span><span style="color: #0000FF;">Equal</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">2</span>, cart<span style="color: #008000;">.</span><span style="color: #0000FF;">Items</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ElementAt</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>In questo modo la creazione degli oggetti CartItem è demandato all&#8217;interno della classe ShoppingCart (che diventerà molto probabilmente l&#8217;aggregate root&#8230;ne parleremo più avanti).<br />
Una possibile implementazione è la seguente:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:775px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ShoppingCart<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">readonly</span> List<span style="color: #008000;">&lt;</span>CartItem<span style="color: #008000;">&gt;</span> _items<span style="color: #008000;">;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> ShoppingCart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; _items <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List<span style="color: #008000;">&lt;</span>CartItem<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> IEnumerable<span style="color: #008000;">&lt;</span>CarItem<span style="color: #008000;">&gt;</span> Items<br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ReadOnlyCollection<span style="color: #008000;">&lt;</span>CartItem<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>_items<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> ItemCount <span style="color: #008000;">&#123;</span> get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; CartItem item <span style="color: #008000;">=</span> _items<span style="color: #008000;">.</span><span style="color: #0000FF;">SingleOrDefault</span><span style="color: #008000;">&#40;</span>i <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> i<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span> <span style="color: #008000;">==</span> itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>item <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span> <br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; item<span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span><span style="color: #008000;">++;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; item <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> CartItem<span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; item<span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>item<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span><br />
<br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> CartItem<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Id <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> <span style="color: #0600FF; font-weight: bold;">private</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Quantity <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> CartItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> id<span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Id <span style="color: #008000;">=</span> id<span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Con questa implementazione i test diventano tutti verdi.<br />
Dedichiamoci al refactoring che questa volta serve.<br />
Non mi piace inoltre il fatto di dover impostare nel metodo AddItem il valore di Quantity a 1, quindi sposto la definizione della quatità sull&#8217;oggetto CartItem. Non mi piace neppure che Quantity sia esposto in scrittura, quindi aggiungo un metodo AddOne:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; CartItem item <span style="color: #008000;">=</span> _items<span style="color: #008000;">.</span><span style="color: #0000FF;">SingleOrDefault</span><span style="color: #008000;">&#40;</span>i <span style="color: #008000;">=&gt;</span> i<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span> <span style="color: #008000;">==</span> itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>item <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; item<span style="color: #008000;">.</span><span style="color: #0000FF;">AddOne</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">else</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> CartItem<span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>mentre la class CartItem:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> CartItem<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Id <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> <span style="color: #0600FF; font-weight: bold;">private</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Quantity <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> <span style="color: #0600FF; font-weight: bold;">private</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> CartItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> id<span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Id <span style="color: #008000;">=</span> id<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Quantity <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddOne<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Quantity<span style="color: #008000;">++;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Così le cose sono un po&#8217; meglio anche se, si potrebbe provare ad eliminare l&#8217;if nel metodo AddItem, ma per ora ci tappiamo il naso e continuiamo, vediamo cosa succede.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/NCjKGvICiw8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=321</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un mese di pomodoro</title>
		<link>http://blog.codiceplastico.com/ema/?p=298</link>
		<comments>http://blog.codiceplastico.com/ema/?p=298#comments</comments>
		<pubDate>Sat, 10 Mar 2012 06:53:27 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>
		<category><![CDATA[pomodoro]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=298</guid>
		<description><![CDATA[Da circa un mese in CodicePlastico abbiamo deciso di adottare la tecnica del pomodoro come strumento per misurare la durata delle nostre attività. La sua introduzione è nata dall&#8217;esigenza di creare dei dati storici di misurazione dei tempi  di un progetto e dal tentativo di ridurre le interruzioni sia interne al team che esterne. Cosi [...]]]></description>
			<content:encoded><![CDATA[<p>Da circa un mese in <a href="http://www.codiceplastico.com" target="_blank">CodicePlastico</a> abbiamo deciso di adottare la <a href="http://www.pomodorotechnique.com/" target="_blank">tecnica del pomodoro</a> come strumento per misurare la durata delle nostre attività.<br />
La sua introduzione è nata dall&#8217;esigenza di creare dei dati storici di misurazione dei tempi  di un progetto e dal tentativo di ridurre le interruzioni sia interne al team che esterne.</p>
<p>Cosi abbiamo deciso di provare seriamente <a href="http://www.ted.com/talks/matt_cutts_try_something_new_for_30_days.html" target="_blank">per un mese</a> la tecnica del pomodoro per ogni attività. La mattina, arrivati in ufficio, ognuno di noi compila il proprio elenco dei task che intende fare durante la giornata e per ogni attività stima quanti pomodori impiegherà a completarla. Quando tutti sono pronti si fa partire il pomodoro. Abbiamo deciso di utilizzare un pomodoro unico per tutto il team così da poter sfruttare le pause (sincronizzate) per eventuali richieste di informazioni o anche solo per scambiare due parole.</p>
<p>Com&#8217;è andato questo mese?</p>
<p><span id="more-298"></span></p>
<p>Ho fatto 82 pomodori (interi), nei primi giorni ne facevo 5-6 interi poi sono migliorato arrivando a 10-12 pomodori al giorno che vi garantisco non sono male. La cosa che mi ha dato più valore è la lista giornaliera delle attività, quella è veramente utilissima e permette di non scordare le cose da fare e soprattutto di rimanere focalizzati sulle cose che vanno fatte tralasciando o posticipando quelle meno importanti. Nella mia lista dei task ci sono anche pomodori dedicati a rispondere alle email, alla fatturazione, alle riunioni interne al team&#8230;.quindi ogni tipo di attività è stata tracciata e misurata.</p>
<p>Il fatto di sapere di essere sotto pomodoro limita al minimo le distrazioni dovute a twitter, giornali, ecc&#8230;.e di conseguenza migliora di molto la qualità generale del lavoro, vi garantisco che 25 minuti sono davvero tanti e se ben usati si riescono a fare un sacco di cose.</p>
<p>Quindi il context switch è stato ridotto tantissimo e così anche le interruzioni all&#8217;interno del team (la classica: &#8220;&#8230;scusa <a href="http://blog.codiceplastico.com/melkio" target="_blank">Ale</a> come si faceva quella cosa&#8230;&#8221;), se davvero mi serve il supporto di un collega, posso, alla pausa successiva, chiedere un pomodoro in pair.<br />
Non ha funzionato benissimo il pomodoro unico, spesso le pause tra uno e l&#8217;altro si prolungavano per aspettare il collega che tornasse alla scrivania o per altri motivi, quindi abbiamo deciso di provare ad usare ognuno il proprio pomodoro e se proprio qualcuno è bloccato perché  serve l&#8217;aiuto di un collega non deve far altro che aspettare che il collega finisca il pomodoro.</p>
<p>Quindi, al di la del pomodoro in quanto tale, credo che una qualsiasi tecnica di time boxing unita ad un todo list con le attività da svolgere aiuta tantissimo a rimuovere le distrazioni sia interne che esterne, ad aumentare la produttività e soprattutto a sapere esattamente quanto tempo si è impiegato su un progetto. Per ora continuiamo e nel prossimo step integriamo la kanban board segnando sui post-it i pomodori impiegati per le attività. Vedremo se la qualità del nostro lavoro riesce a salire ancora un po&#8217;.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/9rD63IzP208" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=298</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Back to basic: TDD (2)</title>
		<link>http://blog.codiceplastico.com/ema/?p=301</link>
		<comments>http://blog.codiceplastico.com/ema/?p=301#comments</comments>
		<pubDate>Thu, 01 Mar 2012 13:40:52 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=301</guid>
		<description><![CDATA[Andiamo ancora piano piano&#8230;nel post introduttivo avevo evidenziato alcuni benefici del TDD mettendo in risalto il fatto che ti obbliga a pensare e ad essere sicuro di aver capito cosa vuole il committente. Di solito alla fine di ogni test mi chiedo se la funzionalità è davvero completa e se ci sono casi limite che [...]]]></description>
			<content:encoded><![CDATA[<p>Andiamo ancora piano piano&#8230;nel post introduttivo avevo evidenziato alcuni benefici del TDD mettendo in risalto il fatto che ti obbliga a pensare e ad essere sicuro di aver capito cosa vuole il committente. Di solito alla fine di ogni test mi chiedo se la funzionalità è davvero completa e se ci sono casi limite che vanno gestiti e in tal caso aggiungo altri test per capire come comportarmi in questi casi.</p>
<p>Tornando al codice della puntata precedente, quello che mi viene da chiedere al product owner è : cosa succede se aggiungo lo stesso item più volte? Naturalmente se il problema è emerso in fase di analisi so già come procedere altrimenti mi fermo e chiedo delucidazioni.</p>
<p><em>[nda: ho visto che i vari siti di ecommerce si comportano in modo diverso, per alcuni il numero di item nel carrello è il numero di prodotti univoci per altri è il numero di articoli presenti.]</em></p>
<p><span id="more-301"></span></p>
<p>Per il nostro esempio il product owner ci dice che aggiungere 2 volte lo stesso articolo non fa aumentare il numero degli item, ma la quantità dello stesso (gestiremo la quantità successivamente).</p>
<p>Quindi il nostro test sarà:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddSameItemTwice_TheItemCountShouldBe1<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Assert<span style="color: #008000;">.</span><span style="color: #0000FF;">Equal</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1</span>, cart<span style="color: #008000;">.</span><span style="color: #0000FF;">ItemCount</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>che compila ma al momento è rosso, visto che non vengono fatti controlli sull&#8217;item aggiunto.</p>
<p>Per farlo diventare verde modifico il metodo AddItem di ShoppingCart</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>_items<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>e, come al solito, valuto possibili refactoring. Quell&#8217;if appena introdotto non mi piace ma per ora lo lascio vedremo con le prossime funzionalità se si potrà rimuovere.</p>
<p>Quindi in questo caso non sono state aggiunte nuove funzionalità, abbiamo solo verificato che quello che avevamo scritto nella puntata precedente rispondesse in tutto e per tutto al requisito gestendo un caso non emerso subito in analisi. Quindi vuol dire che in TDD si alternano fasi di TDD vero (ossia fasi in cui si aggiungono funzionalità tramite un test) a fasi di assestamento in cui si vanno a scrivere Unit Test per verificare che in ogni caso previsto le cose funzionino.</p>
<p>Come al solito trovate il codice su <a href="https://github.com/emadb/TddSerie/" target="_blank">github</a>.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/MnB2McPmXkA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=301</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back to basic: il contesto e il primo test</title>
		<link>http://blog.codiceplastico.com/ema/?p=273</link>
		<comments>http://blog.codiceplastico.com/ema/?p=273#comments</comments>
		<pubDate>Fri, 24 Feb 2012 13:15:53 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=273</guid>
		<description><![CDATA[Per partire con la serie di post sull&#8217;applicazione del TDD dobbiamo prima identificare un contesto che sia abbastanza semplice da capire ma anche abbastanza complesso da implementare. Quello a cui ho pensato è un&#8217;applicazione di e-commerce, alla amazon (con molta fantasia) e vorrei partire proprio dalla gestione del carrello, credo sia capitato a tutti di [...]]]></description>
			<content:encoded><![CDATA[<p>Per partire con la serie di post sull&#8217;applicazione del TDD dobbiamo prima identificare un contesto che sia abbastanza semplice da capire ma anche abbastanza complesso da implementare.</p>
<p>Quello a cui ho pensato è un&#8217;applicazione di e-commerce, alla amazon (con molta fantasia) e vorrei partire proprio dalla gestione del carrello, credo sia capitato a tutti di fare almeno un acquisto online e quindi il dominio dovrebbe essere not<em>o.</em></p>
<p><em>Alcuni disclaimer: non voglio implementare un&#8217;intera applicazione di ecommerce, e, almeno per ora, non voglio tirare in ballo la UI, frameworks, persistenza ecc&#8230;.quindi sebbene le storie per essere completate necessiterebbero di tutta la filiera che va dalla UI fino al database (nel caso si decidesse di usare un db) farò delle enormi semplificazioni e mi limiterò all&#8217;implementazione del domain model. Se poi ci sarà la voglia di continuare in futuro monteremo una UI adatta alle operazioni implementate.</em></p>
<p>Iniziamo piano, a piccoli passi e la prima storia che andremo ad implementare è un semplice punto di partenza, il minimo per avere un qualcosa su cui ragionare, aggiungeremo successivamente funzionalità più avanzate.</p>
<address style="padding-left: 30px;">Come utente che sta navigando sul sito posso aggiungere un articolo nel carrello</address>
<p>Partiamo con la scrittura del primo test:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Fact<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem_TheItemIsNotYetInTheBasket_ShouldAddItToTheBasket<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; var cart <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ShoppingCart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; cart<span style="color: #008000;">.</span><span style="color: #0000FF;">AddItem</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">99</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; Assert<span style="color: #008000;">.</span><span style="color: #0000FF;">Equal</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1</span>, cart<span style="color: #008000;">.</span><span style="color: #0000FF;">ItemCount</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p><span id="more-273"></span></p>
<p>Questo semplice test che può risultare perfino banale ma ci permette di posare la prima pietra e ci obbliga a decidere alcune cose: il nome delle classi in gioco e una prima parte di interfaccia che, in questo caso la classe ShoppingCart, dovrà esporre.</p>
<p>Vorrei riflettere un attimo sul metodo di verifica che abbiamo scelto di utilizzare: verificare il valore della proprietà ItemCount. ItemCount è stata introdotta solo per poter testare l&#8217;applicazione, almeno per ora non ha altri scopi, quindi non sono sicurissimo che questo vada bene.<br />
Se ragioniamo a livello funzionale, servirà sicuramente un qualcosa che ci permetta di sapere quanti articoli sono presenti nel carrello (almeno per esporlo vicino all&#8217;icona del carrello), ma al momento non ci serve.</p>
<p>Un&#8217;alternativa sarebbe stata quella di usare un DomainEvent per notificare al resto del mondo il fatto che un articolo è stato inserito, il test avrebbe potuto sottoscriversi all&#8217;evento e fare li l&#8217;asserzione.<br />
Per ora teniamo buona l&#8217;implementazione più classica, vedremo in futuro se spostarci verso una soluzione ad eventi.</p>
<p>Quindi adesso abbiamo un test che non compila. Primo step: facciamolo diventare rosso.</p>
<p>Quindi implemento la classe ShoppingCart in questo modo</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ShoppingCart<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> ItemCount <span style="color: #008000;">&#123;</span> get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>La fase &#8220;rossa&#8221; è molto importante perché è l&#8217;unico feedback che abbiamo sulla bontà del test, se il test è rosso e il messaggio d&#8217;errore è coerente stiamo con buona probabilità testando la cosa giusta.</p>
<p>Quindi è giunto il momento di farlo diventare verde:</p>
<div class="codecolorer-container csharp twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ShoppingCart<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">private</span> IList<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> _items<span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> ItemCount <span style="color: #008000;">&#123;</span> get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> AddItem<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> itemId<span style="color: #008000;">&#41;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; _items <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; _items<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>itemId<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Ora la barra è verde. Refactoring? Al momento non ne abbiamo bisogno, per ora può  bastare, abbiamo scritto un primo test, abbiamo una semplicissima funzionalità, poca cosa, ma comunque un punto di partenza. Le cose importanti che abbiamo fatto sono state decidere il nome della classe e definire l&#8217;interfaccia del metodo per aggiungere un articolo. Notate come per ora non abbiamo introdotto una classe Product, per ora ci limitiamo ad usare l&#8217;id di un ipotetico prodotto.</p>
<p>Trovate il codice sorgente del progetto su <a href="https://github.com/emadb/TddSerie/" target="_blank">github</a></p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/XyuhdLCfk60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=273</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Back to Basic: TDD</title>
		<link>http://blog.codiceplastico.com/ema/?p=229</link>
		<comments>http://blog.codiceplastico.com/ema/?p=229#comments</comments>
		<pubDate>Mon, 20 Feb 2012 13:47:01 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Design & Metodologie]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=229</guid>
		<description><![CDATA[Nonostante parlo di TDD da anni, e alcuni cominciano anche ad annoiarsi, ancora oggi mi rendo conto che è una pratica che non è molto utilizzata e apprezzata come meriterebbe, molti ne parlano, ma pochi la usano. Sicuramente la sua difficoltà principale è nell&#8217;imparare a farlo con profitto, e in quella sensazione che all&#8217;inizio sia [...]]]></description>
			<content:encoded><![CDATA[<p>Nonostante parlo di TDD da anni, e alcuni cominciano anche ad annoiarsi, ancora oggi mi rendo conto che è una pratica che non è molto utilizzata e apprezzata come meriterebbe, molti ne parlano, ma pochi la usano.</p>
<p>Sicuramente la sua difficoltà principale è nell&#8217;imparare a farlo con profitto, e in quella sensazione che all&#8217;inizio sia come programmare con il freno tirato, sai esattamente dove vuoi arrivare ma il fatto di dover scrivere i test rallenta le operazioni. Se siete in questo stato dovete fare ancora un po&#8217; di strada, quel &#8220;sapere esattamente dove arrivare&#8221; è probabilmente sbagliato e il TDD dovrebbe servire a scoprire dove realmente dovete arrivare.</p>
<p>In questo post voglio riassumere quello che secondo me il TDD insegna.</p>
<p><span id="more-229"></span></p>
<h2>Pensa poi scrivi</h2>
<p>Pensare alla prossima mossa, pensare prima a cosa vogliamo implementare senza interessarci al come. Essere obbligati a scrivere un test prima del codice ci obbliga ad avere ben chiaro cosa dobbiamo fare, se non riusciamo a scrivere il test ci fermiamo, chiediamo chiarimenti e solo dopo torniamo al codice. Senza TDD, il fatto di non aver capito emerge dopo, magari dopo aver già scritto svariate righe di codice che dovranno essere adattate o buttate.</p>
<h2>Outside-in</h2>
<p>L&#8217;altro punto molto interessante è l&#8217;approccio. Per me se prima del TDD era bottom-up è diventato outside-in, parto da una funzionalità, da come la voglio dare all&#8217;utente, dalla ui e poi entro nei layer della mia applicazione.  Questo porta ad avere API migliori, più mirate al business.</p>
<h2>Prima il comportamento</h2>
<p>Facendo TDD si è obbligati ad implementare prima il comportamento delle classi e solo dopo si pensa ai dati.</p>
<h2>Piccoli passi</h2>
<p>Si procede a piccoli passi, ogni test aggiunge una piccola funzionalità all&#8217;applicazione e gli altri test verificano che tutto continua a funzionare.</p>
<h2>Limito il contesto</h2>
<p>Il TDD usato con i mock object mi permettere di tenere il focus sulla classe che sto testando, introducendo le dipendenze solo sotto forma di interfaccia che si andranno ad implementare in un secondo momento. Non stupisce quindi che si può implementare completamente un controller senza aver scritto una riga di codice dei servizi da cui esso dipende, di quelli abbiamo però già disegnato le interfacce.</p>
<p>Questi sono i principali effetti del TDD, ho tralasciato quelli più scontati e noti: meno bug, migliore design ecc&#8230;perché la mi sensazione è che dipendano da questi&#8230;il design è migliore perché mi concentro su una classe alla volta, la disegno pensando all&#8217;interfaccia e penso al comportamento.</p>
<p>Ma il TDD non si impara leggendo un libro o seguendo un corso (nemmeno il mio <img src='http://blog.codiceplastico.com/ema/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ), si impara facendolo. Per questo voglio provare a scrivere una serie di post sul TDD per mostrare come un&#8217;applicazione può nascere test dopo test. Mi permetto di chiamare la serie &#8220;Back to basic&#8221; rubando il titolo alla <a href="http://www.agilemovement.it/video/back-to-basics-oop-and-design" target="_blank">keynote</a> che <a href="https://twitter.com/paolopolce" target="_blank">Paolo Polce</a> ha tenuto all&#8217;agileday del 2011.</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/M0Eao1hz-cM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=229</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Perchè UGIALT.net ha chiuso?</title>
		<link>http://blog.codiceplastico.com/ema/?p=224</link>
		<comments>http://blog.codiceplastico.com/ema/?p=224#comments</comments>
		<pubDate>Tue, 24 Jan 2012 14:30:28 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[.NET, C#]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[ugialtnetconf]]></category>
		<category><![CDATA[webdebs]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=224</guid>
		<description><![CDATA[Sabato 21 gennaio si è tenuta l&#8217;ultima ugialt.net conference, ultima nel senso che non ce ne saranno altre. Basta. Finito. Chiuso. C&#8217;è un filo di dispiacere come per ogni cosa che finisce ma io, Simone e Claudio crediamo che sia stata la cosa più naturale da fare. UgiALT.net è nata nel 2008, ricordo che nella [...]]]></description>
			<content:encoded><![CDATA[<p>Sabato 21 gennaio si è tenuta l&#8217;ultima <a href="http://ugialt.net" target="_blank">ugialt.net</a> conference, ultima nel senso che non ce ne saranno altre. Basta. Finito. Chiuso.</p>
<p>C&#8217;è un filo di dispiacere come per ogni cosa che finisce ma io, <a href="http://twitter.com/simonech" target="_blank">Simone</a> e <a href="http://twitter.com/jitidea" target="_blank">Claudio</a> crediamo che sia stata la cosa più naturale da fare.</p>
<p>UgiALT.net è nata nel 2008, ricordo che nella prima conf eravamo circa una dozzina, <a href="http://codeclimber.net.nz/" target="_blank">Simone</a> ci spiegava il nuovo ASP.NET MVC e <a href="http://blogs.ugidotnet.org/antonioganci/" target="_blank">Antonio</a> ci parlava di metriche del codice, pochi ma molto attivi e con interessanti discussioni.</p>
<p><span id="more-224"></span></p>
<p>Così è nato il gruppo e negli anni è cresciuto tanto dal punto di vista della partecipazione alle conferenze ma non è mai cresciuto dal punto di vista della community visto che a &#8220;fare le cose&#8221; siamo sempre rimasti in 3. Non c&#8217;è polemica, davvero, sappiamo bene che il tempo è sempre meno di quello che si crede e l&#8217;organizzazione di una conferenza ne richiede parecchio e chi sceglie di farlo è perché ha una propensione naturale per questo tipo di attività e lo fa divertendosi senza volere ritorni. Poi però un giorno ci si sveglia stanchi e si comincia a pensare ad altri modi per riempire il tempo libero e si devono abbandonare alcune cose a favore di altre.</p>
<p>Poi il ALT.NET è morto. Nessuno più ne parla per la gioia di chi in questi anni ha solo criticato il movimento, le mailing list una volta attivissime oggi vengono riattivate solo grazie a qualche messaggio di spam. Quindi di fatto non ha più senso parlare di ALT.NET. Molti iscritti al movimento sono migrati su altre piattaforme altri invece hanno accettato quei piccoli miglioramenti di Microsoft e sono rientrati nel comodo nido.</p>
<p>In Italia non so che effetti ha avuto il movimento ALT.NET, non sono in grado di misurarlo, spero solo che grazie alle numerose conferenze qualcuno sia riuscito ad avere una visione di cose c&#8217;è oltre .NET e magari sia riuscito anche a scrivere un programma su una piattaforma diversa. Se non altro sono sicuro che siamo riusciti a far nascere nuove amicizie e collaborazioni e siamo riusciti a far parlare i fanatici di .NET con persone che la pensano diversamente da loro (ad esempio sabato, è stato bello vedere <a href="http://twitter.com/imperugo" target="_blank">Ugo</a> che è rimasto affascinato dalla sessione su <a href="http://nodejs.org/" target="_blank">node.js</a>).</p>
<p>Infine l&#8217;ultimo motivo della chiusura è legato alla sostenibilità delle nostre conferenze. UgiALT.net ha sempre cercato di essere una community indipendente e crediamo di esserci riusciti, ci siamo sempre sentiti liberi di parlare di qualsiasi tematica senza avere influenze da sponsor o partner. Ma organizzare una conferenza costa e le donazioni non funzionano.</p>
<p>Giusto per fare 2 conti e per chiarire a tutti come funziona, quest&#8217;anno abbiamo raccolto circa 650 euro di donazioni per 190 iscritti, di cui partecipanti circa 150. Se teniamo conto che il <a href="http://www.grusp.it/" target="_blank">GRUSP</a> ha donato 150 euro senza di fatto partecipare vuol dire che ogni partecipante ha donato mediamente poco più di 3 euro. In realtà non hanno donato tutti ma solo 40 persone tra cui numerosi speaker.</p>
<p>A cosa sono serviti i soldi? Abbiamo regalato una maglietta a quasi tutti i partecipanti, abbiamo speso 15o euro per gli adesivi e qualche altra decina di euro per la cancelleria e abbiamo pagato il pranzo e la cena agli speaker. Questo, ancora una volta non è polemica, ma una considerazione che dimostra che una conferenza &#8220;gratuita&#8221; per noi  non è sostenibile. E consideriamo che <a href="http://www.avanade.com/it-it/Pages/default.aspx" target="_blank">Avanade</a> ci ha ospitati gratuitamente nella loro sede altrimenti sarebbero servite altre migliaia di euro per affittare le sale.</p>
<p>La morte di <a href="http://ugialt.net" target="_blank">UgiALT.net</a> non implica che non ci saranno più conferenze con quel taglio, durante la keynote abbiamo di fatto nominato i nostri eredi e siamo certi che saranno all&#8217;altezza. Per quanto mi riguarda avrò più tempo da dedicare a <a href="http://webdebs.org" target="_blank">WebDeBs</a> che sta già lavorando sodo e alcune  iniziative verranno pubblicate presto.</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/wLiSjh9TW5Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=224</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Professionisti del web: ecco cosa abbiamo fatto noi</title>
		<link>http://blog.codiceplastico.com/ema/?p=211</link>
		<comments>http://blog.codiceplastico.com/ema/?p=211#comments</comments>
		<pubDate>Fri, 20 Jan 2012 15:43:53 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=211</guid>
		<description><![CDATA[Il post sui pagamenti ha fatto un po&#8217; di rumore ed era quello che volevo, i pensieri che ho raccontato sono il sunto di mesi di osservazioni e di situazioni che sono peggiorate col tempo. Verso la fine dello scorso anno abbiamo preso alcuni provvedimenti che vorrei condividere con voi a partire dai contratti. La prima [...]]]></description>
			<content:encoded><![CDATA[<p>Il <a title="Professionisti del web…ribellatevi!" href="http://blog.codiceplastico.com/ema/?p=199">post</a> sui pagamenti ha fatto un po&#8217; di rumore ed era quello che volevo, i pensieri che ho raccontato sono il sunto di mesi di osservazioni e di situazioni che sono peggiorate col tempo. Verso la fine dello scorso anno abbiamo preso alcuni provvedimenti che vorrei condividere con voi a partire dai contratti.</p>
<p>La prima cosa che abbiamo fatto è stato contattare un avvocato per formalizzare i nostri contratti. Sono più di 5 anni che lavoro come freelance/imprenditore e i miei rapporti con i clienti sono sempre stati regolati da offerte scritte di nostro pugno che spesso non venivano neppure firmate dal cliente. Quindi si basava tutto sulla parola di gentiluomini&#8230;e oggi ce ne sono pochi. A ottobre abbiamo contattato un avvocato per capire se c&#8217;erano margini di miglioramento. Ci ha ribaltato! Abbiamo fatto 2 o 3 incontri, gli abbiamo spiegato il tipo di attività che facciamo e i problemi ai quali andiamo incontro. Nel giro di poche settimane ci ha preparato una serie di documentazione che ad ogni offerta va allegata a quella che noi chiamiamo documento tecnico. Sono parecchie pagine, condizioni generali, particolari, clausole, ecc&#8230;scritte in <em>legalese</em>, e che il cliente deve firmare e mandarci via fax (no email, l&#8217;email, purtroppo in italia non ha valore legale) per accettare il tutto. Se anche voi volete rivolgervi ad un avvocato (cosa che consiglio) assicuratevi che abbia un minimo di competenza nel settore informatico altrimenti non sarà facile spiegare cosa fate e cosa vendete.</p>
<p><span id="more-211"></span></p>
<p>Avere un contratto di questo tipo ci da una certa tranquillità in quanto li è scritto esattamente quali sono i nostri doveri e i doveri del cliente, ad esempio c&#8217;è scritto che se è previsto un acconto, noi non iniziamo a scrivere una riga di codice se non vediamo l&#8217;acconto sul nostro conto corrente, c&#8217;è scritto che se c&#8217;è un giorno di ritardo nei pagamenti ci sarà un ritardo nella consegna del software, c&#8217;è scritto che se il cliente non risponde alle nostre domande non potremo continuare lo sviluppo, il tutto in un linguaggio serio e formale che permetterà, sperando che non succeda mai, ad un giudice di decidere chi ha ragione.</p>
<p>Formale, parola che a noi dev puzza ma che è un&#8217;altra cosa che dobbiamo imparare. Nel nostro settore è abitudine diventare amici dei clienti fin dal primo incontro, ci si da del tu ancora alla prima telefonata. Questo però rende difficile il rapporto professionale e le eventuali discussioni con il con cliente. Tenere un rapporto più distaccato aiuta tutti a rispettare le posizioni e gli impegni presi e questo non vuol dire essere scortesi ma solo rispettarsi a vicenda: i clienti non sono amici con i quali uscite nel weekend.</p>
<p>Questa formalità insieme ai contratti da un senso di professionalità, fa bene a noi e fa bene al cliente che capisce fin dal primo incontro che non sta avendo a che fare con dei ragazzini inesperti ma con persone che hanno esperienza che sanno il fatto proprio e questa esperienza si ripercuote positivamente anche sul lavoro che faremo. Non nego che alcuni clienti, visto tutto il &#8220;malloppo&#8221; di carta che devono firmare si sono spaventati ma hanno comunque firmato e rispettato gli impegni.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/d4qIU3i_oj4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=211</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Professionisti del web…ribellatevi!</title>
		<link>http://blog.codiceplastico.com/ema/?p=199</link>
		<comments>http://blog.codiceplastico.com/ema/?p=199#comments</comments>
		<pubDate>Thu, 12 Jan 2012 10:14:22 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=199</guid>
		<description><![CDATA[Il 2011 è stato un anno particolare: la crisi, la situazione europea, il cambio di governo in Italia hanno mosso le coscienze dei cittadini che sembrano aver iniziato un percorso verso l&#8217;acquisizione di un nuovo senso civico (io ci voglio credere ) Da più fonti però si capisce che le cose non vanno benissimo, alcuni [...]]]></description>
			<content:encoded><![CDATA[<p>Il 2011 è stato un anno particolare: la crisi, la situazione europea, il cambio di governo in Italia hanno mosso le coscienze dei cittadini che sembrano aver iniziato un percorso verso l&#8217;acquisizione di un nuovo senso civico (io ci voglio credere <img src='http://blog.codiceplastico.com/ema/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</p>
<p>Da più fonti però si capisce che le cose non vanno benissimo, alcuni fatti.</p>
<ul>
<li>Ha fatto scalpore, ma non abbastanza, la <a href="http://corrieredelveneto.corriere.it/veneto/notizie/cronaca/2011/17-dicembre-2011/imprenditore-morto-suicida-ha-trovato-solo-porte-chiuse-1902569569892.shtml" target="_blank">notizia</a> del suicidio dell&#8217;imprenditore veneto che non riusciva a riscuotere i crediti per 200k euro.</li>
<li>Si è parlato molto su twitter di questo <a href="http://www.delfinsblog.it/2011/12/11/siamo-eroi/" target="_blank">post</a> in cui noi italiani siamo dipinti come eroi perché riusciamo a sopportare ritardi enormi nei pagamenti, e nonostante questo ce la facciamo (ma non sempre come abbiamo visto).</li>
<li>Cris ieri su <a href="https://twitter.com/#!/areaweb/status/157008737347964928" target="_blank">twitter</a> ha scritto: &#8220;<em>sono indeciso se cambiare la mia mission in &#8220;banca&#8221;, visto che sto continuando ad anticipare lavoro (quindi soldi) ai miei clienti. <s><a title="#shit" href="https://twitter.com/#!/search?q=%23shit" rel="nofollow">#</a></s></em><strong><em><a title="#shit" href="https://twitter.com/#!/search?q=%23shit" rel="nofollow">shit</a></em>&#8220;</strong></li>
<li>In <a href="http://www.codiceplastico.com" target="_blank">CodicePlastico</a> abbiamo chiuso un buon 2011 dal punto di vista del fatturato ma circa il 40% lo dobbiamo ancora incassare.</li>
</ul>
<p>A me tutto questo fa molto incazzare, il nostro lavoro è principalmente di tipo intellettuale, fortunatamente non dobbiamo investire soldi in macchinari costosi ma questo non vuol dire che non c&#8217;è un&#8217;investimento alle spalle. Per poter fare una consulenza su ASP.NET MVC devo passare giornate a studiare, provare, formarmi, tutto tempo che *investo* per poi potermi vendere come consulente alle aziende che ne hanno bisogno. E siccome il mio cliente ottiene valore immediato dalla mia consulenza, io voglio essere pagato immediatamente.</p>
<p>Il proposito per il 2012 che io faccio, ma che vorrei che tutti i professionisti del web facciano, è quello di non concedere termini di pagamento lunghi e lasciar perdere i clienti che vogliono pagare a più di 30 giorni. Io nelle prossime settimane, abbandonerò alcuni clienti che seppur validi, hanno tempi di pagamento a 60 o 120 giorni. Lo faccio per me stesso e invito anche voi a farlo, e più siamo ad imporci più la qualità del nostro lavoro può migliorare.</p>
<p>Per chi non è ancora convinto di quello che ho scritto lo invito a guardare questo video dal titolo esemplare: <a href="http://vimeo.com/22053820" target="_blank">Fuck you, pay me</a>.</p>
<p>Lascio infine un paio di link sempre sul tema pagamenti, ritardi e pigrizia di Francesco Fullone: <a href="http://www.fullo.net/blog/2011/12/12/e-tutta-questione-dabitudine-3/" target="_blank">uno</a> e <a href="http://www.fullo.net/blog/2011/08/17/la-sottile-arte-della-contrattazione-con-asce-bipenne-ai-tempi-del-web-2-0/" target="_blank">due</a>.</p>
<p>Le cose possono cambiare.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/0YQf9bAM5B8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=199</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Uno sguardo sul mio 2011 da programmatore</title>
		<link>http://blog.codiceplastico.com/ema/?p=167</link>
		<comments>http://blog.codiceplastico.com/ema/?p=167#comments</comments>
		<pubDate>Fri, 16 Dec 2011 20:34:34 +0000</pubDate>
		<dc:creator>ema</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Todo]]></category>

		<guid isPermaLink="false">http://blog.codiceplastico.com/ema/?p=167</guid>
		<description><![CDATA[Come ogni anno questo è un periodo di bilanci sull&#8217;anno trascorso e di propositi per quello nuovo. Oggi sono andato a rileggermi la lista dei todo che a fine 2010 avevo scritto per il nuovo anno e posso dire con orgoglio che ho fatto quasi tutto quello che mi ero ripromesso di fare. La lista [...]]]></description>
			<content:encoded><![CDATA[<p>Come ogni anno questo è un periodo di bilanci sull&#8217;anno trascorso e di propositi per quello nuovo. Oggi sono andato a rileggermi la lista dei todo che a fine 2010 avevo scritto per il nuovo anno e posso dire con orgoglio che ho fatto quasi tutto quello che mi ero ripromesso di fare.</p>
<p>La lista conteneva MongoDb, un nuovo linguaggio di programmazione e partecipare ad un progetto open source.</p>
<p>MongoDb l&#8217;ho usato in un paio di piccoli progetti uno in C# e uno in RubyOnRails, in entrambi i casi ho amato la sua immediatezza e libertà nello schema dei dati, devo ancora capire e ragionare su come va modellato l&#8217;uso delle collezioni, degli embedded documents e delle relazioni, sono agli inizi, lo strumento è molto promettente (soprattutto in ottica DDD) ma come per tutti i db no-sql vanno affrontati i problemi derivanti da una mentalità relazionale.</p>
<p>Il nuovo linguaggio di programmazione è Ruby, ho scritto parecchio su questo tema, ho fatto un paio di progetti durante l&#8217;anno. Ruby è un linguaggio stupendo, di una semplicità elegante, sintetico ma leggibile, e poi c&#8217;è la community di Ruby che è attivissima, sforna gemme alla velocità della luce e realizza cose veramente interessanti. Non conosco ancora Ruby come vorrei, anche qui i miei legami con i linguaggi statici rallentano il salto verso il vero potere di ruby che sta nella metaprogrammazione.</p>
<p>Sul progetto OpenSource ci sto ancora lavorando, da un lato è nato conf-oo il sito usato per la ugialt.net che è disponibile su github, è molto prototipale, ha alcune buone idee ma ci si deve lavorare, è nato in fretta in queste ultime settimane vedremo di fare refactoring appena prendiamo fiato. Poi c&#8217;è un altro progetto in porto che però è ancora top-secret.</p>
<p>Questi sono stati i 3 todo &#8220;consegnati&#8221; a fine anno, ora è tempo di pensare al 2012.</p>
<img src="http://feeds.feedburner.com/~r/blogema/~4/LPc9oZ0u99c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codiceplastico.com/ema/?feed=rss2&amp;p=167</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

