<?xml version="1.0" encoding="UTF-8"?>
<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/"
	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/"
	>

<channel>
	<title>micheledellatorre.net &#187; Ruby</title>
	<atom:link href="http://www.micheledellatorre.net/category/informatica/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.micheledellatorre.net</link>
	<description>Informatica in moto</description>
	<lastBuildDate>Tue, 27 Jul 2010 21:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Ruby: prime sensazioni</title>
		<link>http://www.micheledellatorre.net/2008/05/24/ruby-prime-sensazioni/</link>
		<comments>http://www.micheledellatorre.net/2008/05/24/ruby-prime-sensazioni/#comments</comments>
		<pubDate>Sat, 24 May 2008 13:13:03 +0000</pubDate>
		<dc:creator>Michele Della Torre</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.micheledellatorre.net/?p=23</guid>
		<description><![CDATA[Come ho scritto qualche tempo fa, ho iniziato a giocare un po&#8217; con Ruby, cercando di realizzare un piccolo gioco. Il primo approccio non è stato dei più felici. Ruby è un linguaggio dinamico che sfrutta la tipizzazione dinamica, quindi può essere modificato a runtime il comportamento di una classe e non vi sono controlli sul tipo a [...]]]></description>
			<content:encoded><![CDATA[<p>Come ho scritto qualche tempo fa, ho iniziato a giocare un po&#8217; con Ruby, cercando di realizzare un piccolo gioco.<br />
Il primo approccio non è stato dei più felici.<span id="more-23"></span></p>
<p>Ruby è un linguaggio dinamico che sfrutta la tipizzazione dinamica, quindi può essere modificato a runtime il comportamento di una classe e non vi sono controlli sul tipo a compile-time.<br />
Queste due caratteristiche danno una flessibilità incredibile al linguaggio, ad esempio pensate di avere a che fare con un&#8217;applicazione in cui i numeri devono essere trasmessi sulla rete con una codifica particolare a 16 bit; con un linguaggio come Java svilupperemo un metodo con la seguente signature</p>
<pre>public static byte[] encodeFloat(float f)</pre>
<p>ma non è molto &#8220;object oriented&#8221; come soluzione, in Ruby è possibile aggiungere il metodo encode direttamente alla classe numerica, arrivando poi a scrivere codice del tipo</p>
<pre>socket.sendData( 10.encode )</pre>
<p>che è sicuramente più pulito.</p>
<p>Tutta questa flessibilità però ha un prezzo molto salato,infatto il compilatore non è più un nostro alleato e si finisce col perdere tantissimo tempo alla ricerca di un errore comune come la scrittura errata del nome di una variabile o di un suo metodo. Il fatto più irritante è che questo problema può essere evidenziato solo dopo molto tempo. Prendiamo il seguente esempio in pseudocodice:</p>
<pre>numero = random(10000)
if (numero &gt; 0) 
    risultato = log(numero).toString()
else
    risultato = numro.toString()</pre>
<p>in un linguaggio come Java o C# si viene segnalato subito che nell&#8217;ultima riga abbiamo sbagliato a scrivere il nome della variabile, mentre in Ruby ce ne accorgiamo solo quando viene eseguito quel ramo di codice, ma è evidente che la probabilità è molto bassa.</p>
<p>Il test diviene quindi fondamentale visto che deve prendersi carico anche dei compiti che normalmente vengono eseguiti dal compilatore, quindi una metodologia test first è praticamente obbligatoria (tant&#8217;è che Ruby ha integrato un framework di test simile a JUnit).</p>
<p>Preso singolarmente questa mancanza non sembrerebbe quindi così grave: chi, come me, scrive sempre i test prima del codice non ha particolari problemi. Peccato che non sia vero.<br />
Tanto per cominciare il compilatore è davvero comodo, cioè ci fa risparmiare tempo, per alcuni tipi di modifiche: ad esempio supponiamo di esserci resi conto che una certa classe è inutile e perchè può essere sostituita con una classe fornita da una libreria. La cosa più rapida è cancellare la vecchia classe, guardare quali sono i file che non compilano più e modificarli: con un IDE come Eclipse l&#8217;operazione è davvero molto veloce, visto che con un semplice doppio click sull&#8217;errore si viene rimandati dalla riga corrispondente.<br />
In Ruby invece bisogna continuare a lanciare i test finchè la barra non è verde&#8230; insomma, è un lavoro decisamente più lungo, specialmente se i test non riescono a darci un&#8217;idea precisa di dove sia l&#8217;errore.</p>
<p>Il secondo limite, ben più grave, è in sede di refactoring, specialmente per quelli molto comuni come la rinominazione di un metodo o una variabile visto che la mancanza di tipizzazione statica non fornisce alcun indizio al motore di refactoring stesso (tant&#8217;è che Netbeans ci obbliga a vedere la preview e accettarla).</p>
<p>Dalla mia breve esperienza, posso dire che Ruby è ottimo quando si devono scrivere programmi relativamente piccoli in tempi rapidi, mentre mi affiderei ad un linguaggio con un numero maggiori di controlli a compile time, come Java o C#, per programmi più vasti o critici.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.micheledellatorre.net/2008/05/24/ruby-prime-sensazioni/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Suite di test in Ruby</title>
		<link>http://www.micheledellatorre.net/2008/04/14/suite-di-test-in-ruby/</link>
		<comments>http://www.micheledellatorre.net/2008/04/14/suite-di-test-in-ruby/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 20:12:58 +0000</pubDate>
		<dc:creator>Michele Della Torre</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.micheledellatorre.net/?p=15</guid>
		<description><![CDATA[Una della basi per poter effettuare il refactoring in modo sicuro e tranquillo è l&#8217;avere a disposizione un insieme di test sufficientemente grande da lanciare molto spesso per verificare che il lavoro svolto non abbia introdotto errori. Utilizzando Java ed Eclipse è molto semplice lanciare tutti i test di un progetto, basta cliccare con il [...]]]></description>
			<content:encoded><![CDATA[<p>Una della basi per poter effettuare il refactoring in modo sicuro e tranquillo è l&#8217;avere a disposizione un insieme di test sufficientemente grande da lanciare molto spesso per verificare che il lavoro svolto non abbia introdotto errori.<br />
Utilizzando Java ed Eclipse è molto semplice lanciare tutti i test di un progetto, basta cliccare con il pulsante destro sul progetto e selezionare &#8220;run as&#8230; JUnit test&#8221;, ma con Netbeans e Ruby non è così immediato: è infatti necessario creare una suite di test, cioè un insieme di test cases che quando lanciato esegue tutti i test contenuti.</p>
<p><span id="more-15"></span>In Java questo è un tipico caso di Composite, mentre in Ruby è possibile sfruttare la sua capacità di eseguire altri file in modo molto semplice a runtime grazie alla funzione require.</p>
<p>Il modo più semplice di procedere è usare una qualche convenzione per il nome dei singoli file di test, io, ad esempio, chiamo foo_test.rb il file che contiene i test della classe foo.rb.<br />
Ora, ricordandosi che la require non è una direttiva del compilatore, ma una vera e propria funzione, è possibile richiamarla all&#8217;interno di un semplice ciclo che scorre tutti i file della directory il cui nome matcha il pattern *_test.rb:</p>
<blockquote>
<pre>Dir.glob("../test/*_test.rb").each do |file|
  require file
end</pre>
</blockquote>
<p>Notare che la glob ritorna un insieme di stringhe e non di file, quindi è possibile passare direttamente ogni elemento alla require senza altre forme di processamento.</p>
<p>Lascio a voi per esercizio l&#8217;implementazione dello script che esegue anche i test delle sottocartelle :p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.micheledellatorre.net/2008/04/14/suite-di-test-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Tower Defense &#8211; strumenti</title>
		<link>http://www.micheledellatorre.net/2008/04/05/ruby-tower-defense-strumenti/</link>
		<comments>http://www.micheledellatorre.net/2008/04/05/ruby-tower-defense-strumenti/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 20:24:49 +0000</pubDate>
		<dc:creator>Michele Della Torre</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.micheledellatorre.net/2008/04/05/ruby-tower-defense-strumenti/</guid>
		<description><![CDATA[In &#8220;Extreme Programming Adventures in C#&#8221; ho apprezzato soprattutto lo spirito di Ron Jeffries che voleva scrivere un editor XML in C# senza avere una conoscenza approfondita del linguaggio. Io mi sono messo in testa di imparare Ruby, giusto per avere un punto di vista differente da quello di Java senza cambiare completamente paradigma di [...]]]></description>
			<content:encoded><![CDATA[<p>In &#8220;Extreme Programming Adventures in C#&#8221; ho apprezzato soprattutto lo spirito di Ron Jeffries che voleva scrivere un editor XML in C# senza avere una conoscenza approfondita del linguaggio.<br />
Io mi sono messo in testa di imparare Ruby, giusto per avere un punto di vista differente da quello di Java senza cambiare completamente paradigma di programmazione; seguendo le orme di Jeffries proverò a scrivere un piccolo gioco della serie &#8220;Tower defense&#8221;, che tanto apprezzo, in Ruby.</p>
<p>Premetto subito che il mio scopo non è fare il gioco, ma imparare un po&#8217; il linguaggio, quindi sono conoscio che il gioco potrebbe non vedere la mai la luce, ma in fondo non è problema grave dal mio punto di vista: se per qualcuno di voi lo è può sempre darmi una mano <img src='http://www.micheledellatorre.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ruby è un linguaggio orientato agli oggetti completamente dinamico, a prima vista sembra ottima l&#8217;idea di poter, ad esempio, aggiungere un metodo ad una classe a runtime, ma se a questo aggiungiamo il fatto che Ruby è interpretato si capisce subito che non si ha un compilatore che ci fa notare alcuni errori. I test quindi hanno un valore ancora più elevato perchè devono essere loro a farci notare i problemi che normalmente sono rilevabili staticamente, perciò userò un approccio TDD (sai che novità, ormai lo uso per tutto!).<br />
Come ambiente di sviluppo non mi sento di usare un normale editor di testo: qualcuno sostiene che facendo tutto a mano si impara di più, ma sicuramente si perde molto più tempo; avendo già scritto qualche programmino di esempio senza un IDE credo di avere almeno un&#8217;idea dei fondamentali e quindi mi sono orientato su Netbeans 6.0.1 che possiede il supporto per Ruby.<br />
Mi appoggerò alla libreria Rubygame, che è un framework per lo sviluppo di giochi in, nemmeno a dirlo, Ruby.</p>
<p>Ora, facciamo due conti: conosco giusto le basi di Ruby, ho letto due tutorial su Rubygame e normalmente non uso Netbeans&#8230; non sembra di certo il miglior modo di partire, ma in fondo sono fiducioso: come ho già detto il mio obiettivo è imparare il linguaggio, quindi non sarà una tragedia che il gioco non sarà mai terminato e comunque credo di avere delle buone basi per tirare fuori qualcosa.</p>
<p>Appena ho scritto un po&#8217; di codice significativo lo posto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.micheledellatorre.net/2008/04/05/ruby-tower-defense-strumenti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
