<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	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/"
	>

<channel>
	<title>dal-cubicolo &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/dal-cubicolo/</link>
	<description>Feed of posts on WordPress.com tagged "dal-cubicolo"</description>
	<pubDate>Sun, 07 Sep 2008 21:44:48 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Chuck Norris 2.0]]></title>
<link>http://masci.wordpress.com/?p=41</link>
<pubDate>Mon, 11 Aug 2008 11:59:10 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=41</guid>
<description><![CDATA[


Curiosavo il web quando mi sono imbattuto in alcuni Chuck Norris Facts per geeks e visto che da p]]></description>
<content:encoded><![CDATA[<p><a href="http://masci.files.wordpress.com/2008/08/chuck_norris1.jpg"></p>
<p style="text-align:center;"><img class="alignnone size-medium wp-image-51" src="http://masci.wordpress.com/files/2008/08/chuck_norris1.jpg?w=237" alt="" width="190" height="238" /></p>
<p></a></p>
<p>Curiosavo il web quando mi sono imbattuto in alcuni <a href="http://it.wikipedia.org/wiki/Chuck_Norris_facts" target="_blank">Chuck Norris Facts</a> per geeks e visto che da poco è uscito il secondo volume della <a href="http://www.welovechucknorris.it/" target="_blank">raccolta in italiano</a> ritengo l'argomento di attualità e li cito qui di seguito, opportunamente tradotti in italico idioma...</p>
<ul>
<li>Il sistema funziona perchè Chuck Norris gli ha detto di farlo.</li>
<li>Chuck Norris non ha bisogno di una suite di test. Sono i test ad avere bisogno di lui.</li>
<li>Le CPU vanno più veloci per scappare da Chuck Norris. (senza peraltro riuscirci, ndt)</li>
<li>Chuck Norris può normalizzare uno schema inserendo dati random.</li>
<li>Chuck Norris può compilare gli errori di sintassi.</li>
<li>Chuck Norris riesce a parsare XML non valido.</li>
<li>Chuck Norris può infrangere la legge di Moore.</li>
<li>Il cervello di Chuck Norris gli fa da controllo di versione, e funziona meglio di Git.</li>
<li>Chuck Norris può fixare qualsiasi cosa senza cambiare niente.</li>
</ul>
<p>Per gli amanti del genere, non perdetevi i <a href="http://www.knuthfacts.com/" target="_blank">Knuth Facts</a>.</p>
<p>L'articolo originale è <a href="http://perlmonks.org/?node_id=702200" target="_blank">qui</a>, e va oltre i geek facts sopra citati!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Programmazione Barocca]]></title>
<link>http://masci.wordpress.com/?p=32</link>
<pubDate>Fri, 08 Aug 2008 08:51:06 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=32</guid>
<description><![CDATA[
Di scuola francese, un sublime esempio di gusto barocco applicato all&#8217;operatore ternario]]></description>
<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://masci.files.wordpress.com/2008/08/coding_comedy1.gif"><img class="alignnone size-medium wp-image-60" src="http://masci.wordpress.com/files/2008/08/coding_comedy1.gif?w=247" alt="" width="247" height="35" /></a></p>
<p>Di scuola francese, un sublime esempio di gusto barocco applicato all'operatore ternario...</p>
<p><code>bool isEmpty = object.isEmpty() ? true : false ;</code></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Conflitti interiori]]></title>
<link>http://masci.wordpress.com/?p=31</link>
<pubDate>Fri, 30 May 2008 09:22:30 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=31</guid>
<description><![CDATA[
&#8230;non vedo come altro spiegare questo:

unsigned ret = -1;
P.S.
A partire da questo, &#8220;Co]]></description>
<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://masci.wordpress.com/files/2008/08/coding_comedy1.gif"><img class="alignnone size-medium wp-image-60" src="http://masci.wordpress.com/files/2008/08/coding_comedy1.gif?w=247" alt="" width="247" height="35" /></a></p>
<p>...non vedo come altro spiegare questo:<br />
<br />
<code>unsigned ret = -1;</code></p>
<p>P.S.<br />
A partire da questo, "<a href="http://masci.wordpress.com/2008/04/04/coding-comedy/" target="_self">Coding Comedy</a>" diventa una categoria di posts :-)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Git, GitHub e Windows]]></title>
<link>http://masci.wordpress.com/?p=17</link>
<pubDate>Thu, 17 Apr 2008 13:16:24 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=17</guid>
<description><![CDATA[Breve guida all&#8217;utilizzo di Git alla maniera di CVS su piattaforma Windows (XP Pro in questo c]]></description>
<content:encoded><![CDATA[<p>Breve guida all'utilizzo di <a title="Git" href="http://git.or.cz/" target="_blank">Git</a> <em>alla maniera di CVS</em> su piattaforma Windows (XP Pro in questo caso), ovvero la sintesi del peggio.</p>
<h3>Scenario</h3>
<p>Due sviluppatori decidono di collaborare ad un progetto Java, si tratta di:</p>
<ul>
<li> Gino - sviluppatore Java, lavora su Windows</li>
<li> Lino - sviluppatore tuttofare, lavora su Mac Os X</li>
</ul>
<p>Lino possiede una macchina CentOS su cui gira un server SVN a casa propria, il tutto funziona bene ma Lino si annoia e spiana la macchina per effettuare alcuni esperimenti. Nel frattempo accade nell'ordine che:</p>
<ol>
<li>L'esigenza di avere un repository comune per i sorgenti del progetto si fa incalzante</li>
<li>Git diventa famoso</li>
<li>GitHub apre i battenti</li>
</ol>
<p>Il resto è storia...</p>
<h3>Step 1 - account su GitHub</h3>
<p>E' la parte più facile, Lino va su <a title="http://github.com" href="http://github.com" target="_blank">http://github.com</a> e registra un account, per ora si accontenta di quello gratuito, che se da un lato non offre la possibilità di avere repository privati, dall'altro è completo in termini di funzionalità a meno del servizio SSL (ma visto che il repository è comunque pubblico...).</p>
<h3>Step 2 - setup di msysgit su Winbloze</h3>
<p>La fama di Git è letteralmente esplosa e il supporto per Windows non ha tenuto il passo. Fortunatamente dei ragazzi volenterosi hanno messo insieme un pacchetto di installazione a partire da materiale esistente: <a title="msysgit" href="http://code.google.com/p/msysgit/" target="_blank">msysgit</a>. Una volta installato, Lino ha a disposizione una shell Unixlike con git 1.5.5 già configurato, ssh e chicche varie. Ci sarebbe anche una GUI Tcl ma Lino non è riuscito a farla funzionare. Per evitare che i logs relativi ai suoi commit su GitHub siano attribuiti all'utente unknown, Lino indica a git il suo username; dalla shell di msysgit, al prompt digita</p>
<pre><code>$ git config --global user.name "lino"
$ git config --global user.email lino@example.com</code></pre>
<h3>Step 3 - setup delle chiavi ssh</h3>
<p>Chi come Lino non ha una coppia di chiavi ssh (!!!) può generarle usando proprio msysgit. Dal menu <em>Start -&#62; Programmi -&#62; Git</em> selezionare la voce Git, si apre una finestra contente la shell; al prompt digitare</p>
<pre><code>ssh-keygen -C “username@email.com” -t rsa</code></pre>
<p>Lino fornisce una password ed accetta le opzioni che il programma suggerisce per il nome e la destinazione dei due files contenenti le chiavi, che finiranno in ~/.ssh/ che tradotto nel path NTFS diventa C:\Documents and Settings\Lino\.ssh. Successivamente bisogna fornire la chiave pubblica a GitHub: basta fare login, editare il proprio account (in alto a destra) e copiare ed incollare il contenuto della chiave pubblica (che è stato salvato in ~/.ssh/id_rsa.pub) nell'apposito box.</p>
<h3>Step 4 - Creazione del repository</h3>
<p>Ovviamente se il repository già esiste questo step è superfluo. Basta avviare la procedura a questo link: <a title="GitHub - crea nuovo repository" href="http://github.com/repositories/new" target="_blank">http://github.com/repositories/new</a> e digitare i comandi suggeriti nella shell di msysgit.</p>
<h3>Step 5 - Clone del repository (era: cvs checkout)</h3>
<p>Per iniziare a lavorare sul repository remoto bisogna effettuare quello che con CVS avremmo chiamato checkout: il clone del repository. Nel pannello di controllo di GitHub, fra i dettagli del proprio progetto, Lino  trova  il seguente:</p>
<blockquote><p>Public Clone URL:                                   <span class="git_url_facebox">git://github.com/lino/progettox.git</span></p></blockquote>
<p>Dalla shell di msysgit Lino punta sulla cartella di lavoro che conterrà il progetto e poi esegue il cosiddetto clone:</p>
<pre><code>$ git clone git://github.com/lino/progettox.git ProgettoX</code></pre>
<p>Se tutto va bene ora nella cartella di lavoro dovrebbe esserci una nuova cartella chiamata ProgettoX contenente i sorgenti. Siamo operativi, Lino può festeggiare e cominciare ad usare Git proprio come faceva con CVS...</p>
<h3>Push delle modifiche (era: cvs commit)</h3>
<p>Lino modifica alcuni files nel repository locale clonato da quello su github; per spedire le modifiche sul repository remoto esegue il cosiddetto push. Per prima cosa, Lino esegue un commit locale, come farebbe con CVS:</p>
<pre><code>$ git commit -m"messaggio di commit"</code></pre>
<p>In seguito, come per il link del clone, Lino recupera da GitHub il push url. Poi, dalla cartella ProgettoX:</p>
<pre><code>$ git push git://github.com/lino/progettox.git</code></pre>
<h3>Pull delle modifiche (era: cvs update)</h3>
<p>Gino ha già fatto il clone del repository su GitHub, per recuperare le ultime modifiche di Lino al progetto esegue il pull:</p>
<pre><code>$ git pull</code></pre>
<h3>Considerazioni</h3>
<p>L'utilizzo di Git alla maniera di CVS consente agli sviluppatori di cambiare sistema di SCM con il minor sforzo mentale possibile ma, come ci si può aspettare, utilizzare git in questo modo è un po' uno spreco... Git ha l'enorme vantaggio di essere un sistema distribuito, perciò ogni repository locale è un'entità autonoma rispetto al progetto complessivo, vale a dire che Lino può branchare localmente il repository, effettuare delle modifiche per conto suo, tornare sulla master branch (la CVS HEAD) quando collabora col team e ancora ritornare sulla propria branch nel tempo libero. Quando pronto potrà fare un merge della branch locale sulla master locale, e solo successivamente fare il push sul repository remoto... e questo è solo per fare un esempio, le possibilità sono veramente tante!</p>
<h3>Riferimenti</h3>
<p>Questo post è il risultato di un meshup di articoli e guide che ho letto per far utilizzare GitHub ad un collega Windows-user, di seguito gli originali:</p>
<p>Git Introduction Tutorial<br />
(<a href="http://www.kernel.org/pub/software/scm/git/docs/tutorial.html" target="_blank">http://www.kernel.org/pub/software/scm/git/docs/tutorial.html</a>)</p>
<p>Git for CVS users<br />
(<a href="http://www.kernel.org/pub/software/scm/git/docs/cvs-migration.html" target="_blank">http://www.kernel.org/pub/software/scm/git/docs/cvs-migration.html</a>)</p>
<p>Providing your SSH key<br />
(<a href="http://github.com/guides/providing-your-ssh-key" target="_blank">http://github.com/guides/providing-your-ssh-key</a>)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Libreria]]></title>
<link>http://masci.wordpress.com/?page_id=14</link>
<pubDate>Tue, 08 Apr 2008 09:32:26 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?page_id=14</guid>
<description><![CDATA[In lettura

Presi in prestito

Dati in prestito
]]></description>
<content:encoded><![CDATA[<h2>In lettura</h2>
<hr />
<h2>Presi in prestito</h2>
<hr />
<h2>Dati in prestito</h2>
]]></content:encoded>
</item>
<item>
<title><![CDATA[coding comedy]]></title>
<link>http://masci.wordpress.com/2008/04/04/coding-comedy/</link>
<pubDate>Fri, 04 Apr 2008 08:26:33 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/2008/04/04/coding-comedy/</guid>
<description><![CDATA[Da un cvs diff spunta questa perla:
if (cond)
  a(); b();
b();
Ovvero perchè l&#8217;uso delle pare]]></description>
<content:encoded><![CDATA[<p>Da un cvs diff spunta questa perla:</p>
<pre><code>if (cond)
  a(); b();
b();</code></pre>
<p>Ovvero perchè l'uso delle parentesi nei blocchi condizionali dovrebbe essere preso un po' più sul serio...</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Prova ad usarlo male!]]></title>
<link>http://masci.wordpress.com/?p=12</link>
<pubDate>Thu, 03 Apr 2008 08:45:45 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=12</guid>
<description><![CDATA[Dal cubicolo di fianco mi segnalano questo post per associazione di idee con il mio di qualche giorn]]></description>
<content:encoded><![CDATA[<p>Dal cubicolo di fianco mi segnalano <a href="http://ozlabs.org/~rusty/index.cgi/tech/2008-03-30.html" title="How Do I Make This Hard to Misuse?" target="_blank">questo post</a> per associazione di idee con il <a href="http://masci.wordpress.com/2008/03/31/sorgenti-sgrammaticati/" title="Sorgenti sgrammaticati" target="_blank">mio</a> di qualche giorno fa. L'<a href="http://en.wikipedia.org/wiki/Rusty_Russell" title="Rusty Russell" target="_blank">autore</a> sa il fatto suo e la questione è molto intrigante...</p>
<p>Quando qualcuno mi propone una soluzione ad un problema di qualche tipo asserendo che "così sarebbe più facile", spesso cado in uno stato ansiogeno prodotto dalla certezza che in realtà "così smetterà di funzionare". Ma è difficile argomentare quando a supporto della propria teoria si ha solo una "sensazione" - abbiamo bisogno di un metodo quantitativo.</p>
<p>Facendo riferimento alle interfacce di programmazione, Russell propone la teoria del "rendine difficoltoso l'uso scorretto". Il concetto è semplice e facile a dirsi, un pò meno a farsi, ma lui da bravo kernel hacker lo sa bene, quindi ecco la sua ricetta per valutare l'efficacia di un metodo al fine di ottenere interfacce <i>difficili da usare male</i> (l'italiano qui non mi supporta un granchè accidenti). Ovviamente vince chi fa più punti!</p>
<p><b>Sbagliare è impossibile: 10 punti.</b><br />
Rientrano in questa categoria le funzioni del tipo <code>fai_questo()</code> o <code>fai_quello()</code>. Ovviamente si può riuscire ad usare male anche queste, ad esempio non chiamandole affatto, ma in linea di massima dovremmo essere al sicuro (i fans del "code by intention" potrebbero contestare l'uso del condizionale ;-) )</p>
<p><b>Fare in modo che il compilatore (ma pure il linker) ci impediscano di sbagliare: 9 punti.</b></p>
<pre><code>#define BUILD_BUG_ON(cond) sizeof(char[1-2*!!(cond)])</code></pre>
<p>Così si ottiene una specie di assert a tempo di compilazione, se cond è diverso da zero il codice non compila. Spargete <code>BUILD_BUG_ON</code> in giro per i sorgenti ed il gioco è fatto.</p>
<p><b>Fare in modo che il compilatore ci avvisi che stiamo sbagliando: 8 punti.</b><br />
Dai sorgenti del kernel:</p>
<pre><code>/*
* min()/max() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x,y) ({ \
  typeof(x) _x = (x);    \
  typeof(y) _y = (y);    \
  (void) (&#38;_x == &#38;_y);    \
  _x &#60; _y ? _x : _y; })
</code></pre>
<p>Se provate ad invocare min() su due variabili di tipo diverso il compilatore emetterà un warning.</p>
<p><b>Quello ovvio è (probabilmente) l'uso corretto: 7 punti.</b><br />
Applicazione del rasoio di Occam alla programmazione.  Voi chiamereste la funzione <code>exit()</code> o <code>_exit()</code>? Non deludetemi...</p>
<p><b>Dare nomi alle cose che dovrebbero suggerirne l'uso: 6 punti.</b><br />
Ancora dal kernel: la funzione che restituisce il reference count per un modulo a volte può fallire (così va il mondo); Russel fa notare come sia vagamente meglio chiamare tale funzione <code>try_module_get()</code> piuttosto che <code>module_get()</code>. Programmatore avvisato...</p>
<p><b>Fa' le cosine a modo o schianto: 5 punti.</b><br />
Se il prim0 venuto tenta di usare la nostra API in malo modo, possiamo inviargli un messaggio subliminale uccidendo l'applicazione a runtime... <code>assert()</code> è nostro amico!</p>
<p><b>Seguire le convenzioni: 4 punti.</b><br />
A volte il conformismo paga... Scrivere delle funzioni i cui prototipi presentino gli argomenti in un ordine logico e noto in letteratura è cosa buona, ad esempio in un wrapper di memcpy mi aspetterei di trovare "la destinazione prima  della sorgente".</p>
<p><b>La lettura della documentazione ci impedirà di sbagliare: 3 punti.</b><br />
Vabè, diciamo solo che se il funzionamento dell'API si basa sulla premessa che <b>bisogna</b> leggere la documentazione siamo messi male...</p>
<p><b>La lettura dell'implementazione ci impedirà di sbagliare: 2 punti.</b><br />
Questa credo si commenti da sola!</p>
<p><b>La lettura del thread appropriato sulla mailing list ci impedirà di sbagliare: 1 punto.</b><br />
A volte le API hanno interfacce inspiegabilmente strane, e magari il motivo è da ricercarsi in qualche ragione storico-filosofica (tipo, "sui sistemi VAX c'erano solo 6 caratteri per fare questo o quello"), in questi casi chiedere sulla lista o sfogliare le FAQ può aiutare, ma certo l'API di turno non brilla per usabilità!</p>
<p>Per un'introduzione al concetto di <i>"Easy to Use" vs "Hard to Misuse" </i>leggete <a href="http://ozlabs.org/~rusty/index.cgi/tech/2008-03-18.html" target="_blank">qui</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Sorgenti sgrammaticati]]></title>
<link>http://masci.wordpress.com/?p=11</link>
<pubDate>Mon, 31 Mar 2008 12:18:11 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=11</guid>
<description><![CDATA[Recentemente per esigenze di manutenzione ho ricompilato un paio di moduli sorgente un po&#8217; dat]]></description>
<content:encoded><![CDATA[<p style="text-align:justify;">Recentemente per esigenze di manutenzione ho ricompilato un paio di moduli sorgente un po' datati; mentre osservavo scorrere l'output della shell mi è caduto l'occhio su un messaggio del compilatore:</p>
<p><code>warning: unused variable 'pippo'</code></p>
<p>Ops... misa che è colpa mia! Ed è andata pure bene, visto che non di rado, soprattutto quando le cose non funzionano come dico io, sono solito scrivere cose tipo:</p>
<p><code>int fava;</code></p>
<p>Noblesse oblige...</p>
<p>Sempre su quei vecchi sorgenti, e sempre a tempo di compilazione, gcc mi produce pure il seguente:</p>
<p><code>warning: Worakaround for &#60;descrizione problema&#62;: please remove it some day!</code></p>
<p>Ancora opera mia...</p>
<p>Mi sovviene allora un aneddoto che ho letto recentemente in <a href="http://www.dreamingincode.com/" target="_blank">Dreaming in Code</a>, dove l'autore <a href="http://www.wordyard.com/" target="_blank">Scott Rosenberg</a> a pag. 308 racconta di commenti al codice sorgente di Windows 2000 di questo tenore:</p>
<p><code>// We have to do this only because Exchange is a moron</code></p>
<p>Il codice sorgente, quello commerciale in particolare, è spesso lontano da quello che il senso estetico di Donald Knuth percepirebbe come gradevole... E' pur vero che in alcuni casi il naming delle variabili, i contenuti dei commenti, la stesura delle macro del preprocessore rappresentano la valvola di sfogo dello sviluppatore, che in qualche modo dovrà pur esternare il proprio malumore. O il proprio pensiero circa un collega. O la propria bastardaggine:</p>
<p><code>#define private public</code></p>
<p>Per approfondire, date una letta <a href="http://www.regdeveloper.co.uk/2008/03/28/case_for_comments_code/" target="_blank">qui</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Assert verbosi]]></title>
<link>http://masci.wordpress.com/?p=10</link>
<pubDate>Mon, 17 Mar 2008 12:39:50 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/?p=10</guid>
<description><![CDATA[Per chi ritiene l&#8217;istruzione
assert(0);
discretamente utile ma poco verbosa, ecco un tip dal c]]></description>
<content:encoded><![CDATA[<p>Per chi ritiene l'istruzione</p>
<p><code>assert(0);</code></p>
<p>discretamente utile ma poco verbosa, ecco un tip dal cubicolo a fianco: <code></code></p>
<p><code>assert(condizione &#38;&#38; "messaggio");</code></p>
<p>o semplicemente: <code></code></p>
<p><code>assert(!"messaggio verboso");</code></p>
<p>il che produce l'output seguente:</p>
<p><code>main.cpp:6: failed assertion `!"messaggio verboso"'</code></p>
<p>Quick and dirty!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[pImpl_ My Ride!]]></title>
<link>http://masci.wordpress.com/2007/12/30/pimpl_-my-ride/</link>
<pubDate>Sun, 30 Dec 2007 00:10:46 +0000</pubDate>
<dc:creator>masci</dc:creator>
<guid>http://masci.wordpress.com/2007/12/30/pimpl_-my-ride/</guid>
<description><![CDATA[
 
Ultimamente passo le mie giornate al cubicolo occupandomi di un coso che tokenizza, parsa e spera]]></description>
<content:encoded><![CDATA[<div class="snap_preview">
<p align="center"> <a href="http://masci.files.wordpress.com/2007/12/pimp_my_ride_logo-copy.jpg" title="pimpl my ride"><img src="http://masci.files.wordpress.com/2007/12/pimp_my_ride_logo-copy.thumbnail.jpg" alt="pimpl my ride" /></a></p>
<p>Ultimamente passo le mie giornate al cubicolo occupandomi di un coso che tokenizza, parsa e sperabilemente esegue delle istruzioni contenute in uno script. Niente di strano, se non che recuperando del codice legacy è saltato fuori un pimpl; vedo di spiegare di cosa si tratta così da fornire una certa autoconsistenza al post…</p>
<p>Il pimpl viene spesso definito “idioma”,  un costrutto dalle caratteristiche precise che possiamo usare per risolvere problemi noti; è stato formalizzato da <a href="http://www.gotw.ca/" target="_blank">Herb Sutter</a> durante uno dei sui quiz per il <a href="http://www.gotw.ca/gotw/" target="_blank">Guru Of The Week</a>. Nel foglietto illustrativo del pimpl troviamo le seguenti indicazioni:</p>
<ul>
<li>L’header file che contiene il pimpl non include altri headers di classi che vengono usate “per valore”, il che comporta tempi di compilazione più rapidi.</li>
<li>Cambiamenti alla parte privata della classe non comportano la ricomplilazione dei moduli sorgente che dipendendono da questa, anche qui tempi di compilazione più rapidi.</li>
<li>Favorisce l’incapsulamento.</li>
</ul>
<p>Sempre nel foglietto illustrativo troviamo le controindicazioni:</p>
<ul>
<li>Sviluppo di codice aggiuntivo.</li>
<li>Il pimpl non può incapsulare dati “protected” eventualmente necessari alle sottoclassi.</li>
<li>L’ulteriore livello di indirezione introdotto fra la classe ed il suo pimpl impatta le performances (non di molto a dire il vero) e richiede un pò più di attenzione in fase di manutenzione.</li>
<li>Non possiamo spostare funzioni virtual all’interno del pimpl.</li>
</ul>
<p>Vediamo un pimpl in azione:</p>
<pre>
<code>
class XImpl; // forward declaration
class X
{
public:
  X();
  ~X();
  // costruttore di copia ed altre amenità...
  void metodoPubblico();
private:
  XImpl* pImpl_;
};</code></pre>
<p>Notate lo stile Hungarian usato per la variabile che incidentalmente da il nome all’idioma stesso!</p>
<p>Ora, osservando la dichiarazione della classe X, possiamo notare il puntatore opaco al pimpl che ci mette al riparo da ricompilazioni selvagge  (vedi punto uno dei benefici effetti del pimpl). Approfondiamo il discorso e passiamo all’implementazione:</p>
<pre>
<code>
#include "x.hpp"

class XImpl
{
public:
  XImpl(X* x) : self_(x) {}
  void metodoPrivatoDiX() {}
  void altroMetodo()
  {
    // accedo ad un metodo pubblico di X
    self_-&#62;metodoPubblico();
  }

  int membroPrivatoDiX_;
};

X::X() : pImpl_(new XImpl(this)) {}
X::~X() {delete pImpl_;}
void X::metodoPubblico() {pImpl_-&#62;membroPrivato_ = 1;}
</code></pre>
<p>Notiamo l’utilizzo del pimpl all’interno dei metodi di X, questo sostituisce quella che sarebbe stata una chiamata ad un metodo privato della classe stessa. Ora è evidente come la classe XImpl sia sconosciuta agli utenti di X; questo significa che cambiando XImpl non ricompileremo il mondo intero (punto due della lista benefici). Altra cosa da notare è che il pimpl che ho scritto si tiene un puntatore alla classe X, questo nell’eventualità che XImpl dovesse accedere a metodi pubblici o virtuali di X per svolgere i propri compiti; si tratta di un altro livello di indirezione, ma possiamo conviverci…</p>
<p>Ne vale la pena? Se ci serve, si, se deve rimanere un esercizio di stile meglio investire il tempo in attività più proficue, come ad esempio farsi un caffè. Nel caso del mio coso parserizzatore il pimpl ha isolato Flex e Bison dal resto del codice, producendo una serie piuttosto lunga di vantaggi (fra cui vedi punto tre lista benefici).</p>
<p>Per approfondire:<br />
<a href="http://c2.com/cgi/wiki?PimplIdiom" target="_blank"> http://c2.com/cgi/wiki?PimplIdiom</a><br />
<a href="http://www.devx.com/cplus/Article/28105" target="_blank"> http://www.devx.com/cplus/Article/28105</a><br />
e naturalmente...<br />
<a href="http://www.gotw.ca/gotw/024.htm" target="_blank"> http://www.gotw.ca/gotw/024.htm</a></div>
]]></content:encoded>
</item>

</channel>
</rss>
