<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/1.5.1-alpha" -->
<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>PDI^2</title>
	<link>http://riffraff.blogsome.com</link>
	<description>Propulsione d'Improbabilità Infinita</description>
	<pubDate>Sun, 08 Jun 2008 23:00:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=1.5.1-alpha</generator>
	<language>en</language>

		<item>
		<title>Mock, MMD e la open() che vorrei</title>
		<link>http://riffraff.blogsome.com/2006/04/26/mock-mmd-e-la-open-che-vorrei/</link>
		<comments>http://riffraff.blogsome.com/2006/04/26/mock-mmd-e-la-open-che-vorrei/#comments</comments>
		<pubDate>Wed, 26 Apr 2006 06:19:29 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>oop</category>
		<guid>http://riffraff.blogsome.com/2006/04/26/mock-mmd-e-la-open-che-vorrei/</guid>
		<description><![CDATA[	Questo post si basa sul piccolo lavoro fatto la volta scorsa per creare special case nei metodi .
Avendo a disposizione quello strumento posso affrontare una delle Grandi Domande: mi conviene fare refactoring per rendere il codice più facilmente testabile se posso evitarlo?
	Nel dettaglio: ho uno script che prende in automatico dei dati da risorse su [...]]]></description>
			<content:encoded><![CDATA[	<p>Questo post si basa sul piccolo lavoro fatto la volta scorsa per <a href="http://riffraff.blogsome.com/2006/04/23/metodi-con-casi-speciali-in-ruby/">creare special case nei metodi </a>.<br />
Avendo a disposizione quello strumento posso affrontare una delle Grandi Domande: mi conviene fare refactoring per rendere il codice più facilmente testabile <em>se posso evitarlo</em>?</p>
	<p>Nel dettaglio: ho uno script che prende in automatico dei dati da risorse su web, e poi fa un grafico con i cambiamenti, insomma una scopiazzatura di <a href="http://www.ehlist.ca">EhList</a>, fatta per giocare con le <a href="http://ruby-it.org/pages/Usare+le+Yahoo%21+API">api di Yahoo! SiteExplorer in ruby</a></p>
	<p>Poiché i servizi sono tutti differenti esiste un metodo specifico per accedere ad ognuno di essi, catturato nell&#8217;esistenza di una classe <tt>Provider</tt> e di varie sottoclassi, ognuna con una descrizione, un metodo specifico per recuperare le informazioni remote ed eventuali altre cose. </p>
	<p>Un esempio di provider è:</p>
	<pre>
class YahooProvider < Provider
  DESC=\"Yahoo SE inbound links\"
  APPID=\"myAppId\"
  URL=\"url yahoo SE?query=%s&#038;appid=%s\"
  def initialize(name)
    text=open(URL%[name,APPID]).read
    @result=Mapping.xml2obj(text)
  end
  def results_size
    @result.xmlattr_totalResultsAvailable
  end
end
</pre>
	<p>se state imprecando contro di me perché non chiudo la connessione aperta con <tt>open()</tt> potete calmarvi, lo script completa le operazioni in meno di un minuto e si chiude, il che fa si che le risorse vengano comunque recuperate.</p>
	<p>Ora: come testare questo provider?  In particolare, come testare l&#8217;operazione di parsing dell&#8217;xml?<br />
La cosa più ovvia è passargli dei dati preconfezionati, magari presi da un&#8217;esecuzione precedente dello script, e verificare che li interpreti correttamente.<br />
Solo che è il metodo <tt>initialize</tt> ad eseguire sia la letttura dei dati che il parsing.<br />
La soluzione che permette di testare meglio tutto ciò è di spostare queste funzionalità in un altro posto per poterle testare in isolamento, con una cosa come questa:</p>
	</pre>
	<pre>
  def read_data()
    open(URL%[name,APPID]).read
  end
  def parse(xml)
    Mapping.xml2obj(xml)
  end
  def initialize(name)
    testo=read_data()
    @result= parse(testo)
  end
</pre>
	<p>Se è vero che questo approccio introduce una certa flessibilità è anche vero che si tratta di una flessibilità non necessaria, o meglio di una fattorizzazione del codice in più parti che però non è utile in quanto non userò mai una delle funzionalità separatamente dall&#8217;altra.<br />
Insomma, sto facendo una cosa di cui non ho bisogno solo per far felici i test, che non è una cosa terribile, ma la eviterei.</p>
	<p>Ma, se siete arrivati a leggere fin qui probabilmente sapete già cosa possiamo fare in questo caso: </p>
	<pre>
require 'stringio'
special Kernel, \"open\" do
  StringIO.new(\"xml di prova\")
end
	
assert_equal valore_atteso, YahooProvider.new(url).results_size
</pre>
	<p>è un hack, e non è molto nella filosofia di come dovrebbero essere i test probabilmente..<br />
ma funziona e non aggiunge complicazioni al codice originale.<br />
La domanda è: cosa è giusto fare? E&#8217; giusto <em>perseguire</em> un approccio alla scrittura di test che è tipico in altri ambienti anche se in questo caso ne posso fare a meno sfruttando le potenzialità di ruby? </p>
	<p>Infine, se vi state chiedendo che cosa significhi la frase relativa ad <tt>open()</tt> nel titolo, sappiate che stavo pensando che sarebbe molto carino poter usare qualcosa come<br />
<tt>open(&#8221;mock://foo&#8221;)</tt>, ed in realtà è possibile farlo con <tt>open-uri.rb</tt>, magari in futuro ne parlerò. Però non è builtin, uffa <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2006/04/26/mock-mmd-e-la-open-che-vorrei/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Piccole riflessioni sulla OOP</title>
		<link>http://riffraff.blogsome.com/2006/02/05/piccole-riflessioni-sulla-oop/</link>
		<comments>http://riffraff.blogsome.com/2006/02/05/piccole-riflessioni-sulla-oop/#comments</comments>
		<pubDate>Sun, 05 Feb 2006 22:15:05 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>oop</category>
		<guid>http://riffraff.blogsome.com/2006/02/05/piccole-riflessioni-sulla-oop/</guid>
		<description><![CDATA[	Questo è un blog-articolo interessante su alcuni approcci differenti alla programmazione , contrapponendo multiple &#038; single dispatch, classi &#038; prototipi, oggetti &#038; closure.
	Contiene anche vari link interessanti, anche se mi pare di averli già visti quasi tutti.
Il che non significa che li abbia guardati con attenzione ed assolutamente è lontano dall&#8217;idea che io possa averli [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://jaortega.wordpress.com/2006/02/05/beyond-mainstream-object-oriented-programming/">Questo</a> è un blog-articolo interessante su alcuni approcci differenti alla programmazione , contrapponendo multiple &#038; single dispatch, classi &#038; prototipi, oggetti &#038; closure.</p>
	<p>Contiene anche vari link interessanti, anche se mi pare di averli già visti quasi tutti.<br />
Il che non significa che li abbia guardati con attenzione ed assolutamente è lontano dall&#8217;idea che io possa averli <em>capiti</em>, so solo che esistono.</p>
	<p>Consiglio in particolare di vedersi i video sul Self System, che tra l&#8217;altra fa venire da chidersi come mai Sun abbia deciso di abbandonare una tecnologia rivoluzionaria per spingere java. </p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2006/02/05/piccole-riflessioni-sulla-oop/feed/</wfw:commentRss>
	</item>
		<item>
		<title>L&#8217;interfaccia umana: come Java ha rovinato la mia mente</title>
		<link>http://riffraff.blogsome.com/2005/12/23/linterfaccia-umana-come-java-ha-rovinato-la-mia-mente/</link>
		<comments>http://riffraff.blogsome.com/2005/12/23/linterfaccia-umana-come-java-ha-rovinato-la-mia-mente/#comments</comments>
		<pubDate>Fri, 23 Dec 2005 11:16:26 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>oop</category>
	<category>java</category>
	<category>personale</category>
		<guid>http://riffraff.blogsome.com/2005/12/23/linterfaccia-umana-come-java-ha-rovinato-la-mia-mente/</guid>
		<description><![CDATA[	Nella blogosfera di recente c&#8217;è stata una specie di flamefest riguardo l&#8217;interfaccia fornita dalla classe Array in ruby.
In pratica Martin Fowler è contento perché questa classe fornisce un&#8217;interfaccia molto ricca in ruby, mentre qualche hard core javanese  ritiene che sia una follia mettere più di dodici metodi in una classe. 
	Ora guardiamoci in faccia, [...]]]></description>
			<content:encoded><![CDATA[	<p>Nella blogosfera di recente c&#8217;è stata una specie di flamefest riguardo l&#8217;interfaccia fornita dalla classe <tt>Array</tt> in ruby.<br />
In pratica Martin Fowler è contento perché questa classe fornisce un&#8217;interfaccia molto ricca in ruby, mentre qualche <em>hard core javanese </em> ritiene che sia una follia mettere più di dodici metodi in una classe. <a id="more-75"></a></p>
	<p>Ora guardiamoci in faccia, la classe Array in ruby ha un po&#8217; troppi metodi, e lo dico sinceramente: </p>
	<pre>
>> [].methods.size
=> 118
>>
</pre>
	<p>Ma parecchi di questi metodi sono ereditati dai suoi antenati: 42 sono presi dalla classe <tt>Object</tt> e dal modulo <tt>Kernel</tt>, si tratta di cose come <tt>print</tt>.<br />
22 vengono &#8220;gratis&#8221; dal modulo <tt>Enumerable</tt>.</p>
	<p>Ne rimangono 56, non perdetevi ancora: 9 sono le versioni con <em>side effect</em> di metodi presenti in <tt>Enumerable</tt>. Quindi ad <tt>Enumerable#map</tt>, che trasforma una collezione in un array attraverso una funzione, corrisponde <tt>Array#map!</tt> che trasforma un array <em>in place</em> attraverso una funzione. </p>
	<p>Rimangono 47 metodi. Cavolo è una bella interfaccia pesante.<br />
Voglio dire, 47 metodi.<br />
Cioè ok, la classe <tt>Vector</tt> in java ne ha 49 ma sono tanti.</p>
	<p>Certo, io so benissimo che le interfacce devono essere piccole. So che fare interfacce molto grosse è un problema. Lo so me lo hanno detto moltissime volte. Però in effetti la mia esperienza personale dice che la classe <tt>Array</tt> in ruby è utile e non mi ha mai dato problemi.<br />
Come direbbero i 99 posse: <em>quello che penso è in cortocircuito con quello che sento</em>. </p>
	<p>Cerco di andare al cuore della questione, scavo nella mia mente di designer OO. Perché un&#8217;interfaccia con molti metodi è negativa? </p>
	<p>Forse limita la modularità ed il refactoring. Penso di no, se avessi bisogno potrei spezzarla. Ah no aspetta: non potrei farlo, perché ovunque ho dichiarato che uso una <tt>IFoo</tt> e non delle <tt>IBar</tt> ed <tt>IBaz</tt>. Cioè in pratica un type system in stile java romperebbe le scatole. Tutto ok per ruby, python e smalltalk, ma anche per haskell ed ML.<br />
Arriviamo dunque alla questione fondante: le classi con un&#8217;interfaccia ricca non sono un problema <em>per se</em>. Esse sono un problema quando diventano un blocco per la modularità e l&#8217;estensibilità.<br />
La classe <tt>Array</tt> non ha questo problema, o almeno io non l&#8217;ho mai trovato.  Quindi il problema (per la mia esperienza) non esiste, ma è solo un sottoprodotto mentale di una cultura rigida dei tipi.  Insomma Java gli ha rovinato la testa. </p>
	<p>Ma quello che è esilarante è quando <a href="http://www.cafeaulait.org/oldnews/news2005December8.html">questo tizio </a> (che ha fatto atnte cose buone) cerca di spiegare come siano malvagi i 47 metodi di <tt>Array</tt><br />
Il primo punto: </p>
	<blockquote><p>
Array.new(size=0, obj=nil)</p>
	<p>  This method creates an array that has size copies of the object.<br />
  Why? Have you ever needed to create an array/list that begins<br />
  its life containing more than one copy of the same object? I don&#8217;t<br />
  think I have.
</p></blockquote>
	<p>Pensateci un attimo. Accarezzate l&#8217;idea che effettivamente non avete mai creato un Array con delle copie di un oggetto. Lasciatevi trasportare dal sentimento che, cavolo, ha detto che è stupido sarà stupido.<br />
Poi pensate che lo zero è un oggetto. Mai usato un array inizializzato a zero. Deve essere dura, specialmente in java dove è l&#8217;init di default. </p>
	<p>E poi questa, stupenda: </p>
	<blockquote><p>
 array < => other_array -1, 0, +1</p>
	<p>    A comparison between arrays. However, without me stating it<br />
    here, can you understand how to tell whether two arrays are<br />
    greater than, equal to, or less than each other?[..]<br />
   Plus how often do you need to compare lists for anything but<br />
   equality anyway?
</p></blockquote>
	<p>Creiamo un altra interfaccia! Cerco di capirlo ma non ci riesco.<br />
Nel frattempo continuo a poter fare</p>
	<pre>
>> puts [p1,p2,p3].sort_by {|p| [p.cognome, p.nome]}
renzi gabriele
renzi nicola
rossi mario
</pre>
	<p>E questa, meravigliosa: </p>
	<blockquote><p>
 abbrev(pattern = nil)</p>
	<p>   &#8220;Calculates the set of unambiguous abbreviations for the strings in self.&#8221;<br />
   Excuse me. What?! This one&#8217;s totally out of left field.
</p></blockquote>
	<p>Ha ragione! è totalmente fuori dal mondo! Ed in effetti non esiste.<br />
E&#8217; in un modulo a se stante, il modulo <tt>Abbrev</tt> che quando viene caricato aggiunge la funzionalità dove deve stare, cioè nella classe Array. Avere le classi aperte ti permette di mettere le funzionalità dove hanno senso, sembra strano ma è utile. </p>
	<blockquote><p>
array.at(index) -> obj or nil</p>
	<p>  As near as I can figure, this is exactly the same as using array<br />
  brackets except it uses a method call. If there is a difference, it&#8217;s<br />
  pretty subtle.
</p></blockquote>
	<p>No, è abbastanza macroscopica e consiste nel fatto che  <tt>[]</tt> può accettare Range, interi, coppia inizio/intervallo ed altro ancora, mentre <tt>at</tt> prende solo un indice. </p>
	<blockquote><p>
 array.nitems -> int</p>
	<p>   &#8220;Returns the number of non-nil elements in self. May be zero.&#8221;<br />
   Another one it never even occurred to me I might need.<br />
   I suspect this one&#8217;s beyond the 90/10 point. heck. It&#8217;s beyond the 99/1 point.
</p></blockquote>
	<p>come disse uno su #ruby-lang:</p>
	<pre>
>> answers=[true,nil,true,nil, nil]
=> [true, nil, true, nil, nil]
>> \"You answered #{answers.nitems} questions\"
=> \"You answered 2 questions\"
</pre>
	<p>Quest&#8217;uomo è stato talmente rovinato da Java, forse. Non capisce che lo zero possa essere una cosa come le altre.  Che anche se ti capita di scrivere una cosa una sola volta alla settimana devi fattorizzarla e non riscriverla ogni volta. E che il posto dove fattorizzare le operazioni sugli array è la classe Array e non <tt>org.me.ArrayUtils</tt>.<br />
Che la piccolezza di un&#8217;interfaccia è un mezzo per raggiungere modularità ed estensibilità e non un fine in se.  </p>
	<p>Vabè, auguri.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2005/12/23/linterfaccia-umana-come-java-ha-rovinato-la-mia-mente/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Design Pattern in $linguaggio</title>
		<link>http://riffraff.blogsome.com/2005/11/04/design-pattern-in-linguaggio/</link>
		<comments>http://riffraff.blogsome.com/2005/11/04/design-pattern-in-linguaggio/#comments</comments>
		<pubDate>Fri, 04 Nov 2005 17:27:22 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>python</category>
	<category>oop</category>
	<category>php</category>
		<guid>http://riffraff.blogsome.com/2005/11/04/design-pattern-in-linguaggio/</guid>
		<description><![CDATA[	Dopo un bel po&#8217; di tempo che ci perdevo tempo sono finalmente riuscito a mettere online un articoletto su cui stavo trafficando da un bel po&#8217;, una specie di analisi parallela dell&#8217;Abstract Factory pattern in Common Lisp/Ruby/Python/etc. 
	Io sono un sostenitore dell&#8217;ipotesi che i DP servano solo se il linguaggio è tonto ,per qualche valore [...]]]></description>
			<content:encoded><![CDATA[	<p>Dopo un bel po&#8217; di tempo che ci perdevo tempo sono finalmente riuscito a mettere online <a href="http://www.siforge.org/articles/2005/11/04-articolo-patterns7.html">un articoletto</a> su cui stavo trafficando da un bel po&#8217;, una specie di analisi parallela dell&#8217;Abstract Factory pattern in Common Lisp/Ruby/Python/etc. </p>
	<p>Io sono un <strong>sostenitore</strong> dell&#8217;ipotesi che i DP servano solo se il linguaggio è <em>tonto</em> ,per qualche valore di <em>tonto</em>, ed in questo singolo caso in esame sembrerebbe che l&#8217;Abstract Factory sia necessario effettivamente solo per valori abbastanza grandi di tontezza. </p>
	<p>Però ho in mente qualche altro pattern che invece forse sarebbe necessario comunque anche in python e ruby, come il visitor (che però è ancora inutile in CL). Insomma in realtà è unindagine interessante.<br />
Specie se riesco ad infilarci dentro anche Haskell  <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
	<p>Comunque, l&#8217;articolo non è venuto bene quanto volevo per mancanza di tempo, ma se non mi sbrigavo a passarlo a <a href="http://www.sunnyspot.org/">lm</a> non l&#8217;avrei finito mai.<br />
Ora devo mettermi a scrivere il secondo, (e  scrivere la tesi e finire il sito del gruppo utenti ruby italia, e finire quell&#8217;applicazione in j2me per imparare i kanji, e sistemare il look di questo blog e &#8230;)
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2005/11/04/design-pattern-in-linguaggio/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Ragioni per cui amo ruby numero 1002, 1003</title>
		<link>http://riffraff.blogsome.com/2005/10/30/ragioni-per-cui-amo-ruby-numero-10021003/</link>
		<comments>http://riffraff.blogsome.com/2005/10/30/ragioni-per-cui-amo-ruby-numero-10021003/#comments</comments>
		<pubDate>Sun, 30 Oct 2005 21:39:05 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>oop</category>
	<category>java</category>
		<guid>http://riffraff.blogsome.com/2005/10/30/ragioni-per-cui-amo-ruby-numero-10021003/</guid>
		<description><![CDATA[	Ispirato da una discussione su wup.it, mi sono tornati in mente questi due esempi del perché preferisco ruby a java:
	Come mettere un array di tipi base in una lista
Sostanzialmente, l&#8217;unico modo (che io conosca) è farlo a mano.
Riscriversi un bel ciclo ogni volta, error prone come piace a noi.
Si noti che esiste un Arrays.asList(Object[]) ma [...]]]></description>
			<content:encoded><![CDATA[	<p>Ispirato da una <a href="http://www.wup.it/article.php?sid=7862">discussione su wup.it</a>, mi sono tornati in mente questi due esempi del perché preferisco ruby a java:</p>
	<p><strong>Come mettere un array di tipi base in una lista</strong><br />
Sostanzialmente, l&#8217;unico modo (che io conosca) è farlo a mano.<br />
Riscriversi un bel ciclo ogni volta, error prone come piace a noi.<br />
Si noti che esiste un <tt>Arrays.asList(Object[])</tt> ma visto che i tipi base in java non sono oggetti, non funziona.<br />
Non solo, per quel che ne so non è neppure <i>possibile</i> scrivere un metodo generico che trasformi un array in una <tt>List</tt>, in quanto a livello di linguaggio non c&#8217;è un&#8217;associazione tra i tipi primitivi e le rispettive classi Boxed.<br />
Ovviamente si può risolvere con una sfilza di <tt>if/else</tt> ma non è che sia un granché come soluzione.</p>
	<p><strong><tt>null</tt> non è un oggetto</strong><br />
Il che significa che non posso scrivere <tt>null.equals(foo)</tt>.<br />
Il che a sua volta significa, ad esempio,  che un metodo per verificare l&#8217;uguaglianza tra due oggetti <tt>Pair</tt>, cioè dei contenitori di coppie di numeri, in ruby sarebbe:</p>
	<pre>
 class Pair
  def == (other)
   first == other.first  and  second == other.second
  end
 end
</pre>
	<p>mentre in java viene una cosa come <a href="http://rifers.org:8088/viewrep/rifers/rife/trunk/src/framework/com/uwyn/rife/datastructures/Pair.java?r=1175">questa</a> (scrollare fino alla riga 43, poi sono 42 righe di codice, java5, la versione che dovrebbe semplificare tutto) [<a href="https://svn.rifers.org/rife/trunk/src/framework/com/uwyn/rife/datastructures/Pair.java">link alternativo</a> senza note/sintassi colorata].<br />
E c&#8217;è chi dice che non avere distinzioni tra tipi primitivi e non sia una cosa buona <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2005/10/30/ragioni-per-cui-amo-ruby-numero-10021003/feed/</wfw:commentRss>
	</item>
	</channel>
</rss>
