<?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>Twoixted again</title>
	<atom:link href="http://www.perezruiz.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.perezruiz.com</link>
	<description>Let's get twoixted again...</description>
	<lastBuildDate>Fri, 11 Dec 2009 23:24:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Booh!!</title>
		<link>http://www.perezruiz.com/2009/09/13/booh/</link>
		<comments>http://www.perezruiz.com/2009/09/13/booh/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 00:10:30 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[OSX]]></category>
		<category><![CDATA[Snow Leopard]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=173</guid>
		<description><![CDATA[Que miedo mamaaaa&#8230;   Snow Leopard incluye un nuevo aviso en el comando sudo que reza tal que &#8220;asín&#8221;

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

]]></description>
			<content:encoded><![CDATA[<p>Que miedo mamaaaa&#8230; <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Snow Leopard incluye un nuevo aviso en el comando <code>sudo</code> que reza tal que &#8220;asín&#8221;</p>

<pre><code>WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/09/13/booh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All Your Base Are Belong To Us</title>
		<link>http://www.perezruiz.com/2009/09/01/all-your-base-are-belong-to-us/</link>
		<comments>http://www.perezruiz.com/2009/09/01/all-your-base-are-belong-to-us/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 21:09:24 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Varios]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=165</guid>
		<description><![CDATA[Gotcha!



Parece que he entrado en un momento del 0,1% no contemplado en el 99,9% de Uptime de Google Mail&#8230;

Casi me siento afortunado.   Os prometo que no se la tengo jurada a Google&#8230;

(AYBABTU)
]]></description>
			<content:encoded><![CDATA[<p>Gotcha!</p>

<p><img src="http://www.perezruiz.com/wp-content/uploads/2009/09/Error-Google1-600x339.jpg" alt="Error 502 Google" title="Error 502 Google" width="600" height="339" class="alignnone size-large wp-image-170" /></p>

<p>Parece que he entrado en un momento del 0,1% no contemplado en el 99,9% de Uptime de Google Mail&#8230;</p>

<p>Casi me siento afortunado. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Os prometo que <a href="http://www.perezruiz.com/2009/05/29/pasa-en-las-mejores-familias/">no se la tengo jurada a Google</a>&#8230;</p>

<p>(<a href="http://es.wikipedia.org/wiki/All_your_base_are_belong_to_us">AYBABTU</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/09/01/all-your-base-are-belong-to-us/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard y Apple haciendo cosas raras</title>
		<link>http://www.perezruiz.com/2009/09/01/snow-leopard-y-apple-haciendo-cosas-raras/</link>
		<comments>http://www.perezruiz.com/2009/09/01/snow-leopard-y-apple-haciendo-cosas-raras/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 22:14:47 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[OSX]]></category>
		<category><![CDATA[Varios]]></category>
		<category><![CDATA[apple]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=163</guid>
		<description><![CDATA[Dejemos las cosas claras: Apple no es la mega-super-guay empresa que muchos parece que quieren que sea. Es una empresa, y punto. Si acaso es de las mejores en cuanto a calidad y diseño, que ya es decir mucho.

Acabo de dar el paso definitivo a Mac OS X con un MacBook Pro que me he [...]]]></description>
			<content:encoded><![CDATA[<p>Dejemos las cosas claras: Apple no es la mega-super-guay empresa que muchos parece que quieren que sea. Es una empresa, y punto. Si acaso es de las mejores en cuanto a calidad y diseño, que ya es decir mucho.</p>

<p>Acabo de dar el paso definitivo a Mac OS X con un MacBook Pro que me he comprado para reemplazar mi equipo Vista de escritorio. Dicho con otras palabras, es la primera vez en 20 años que tengo un Mac exclusivamente.</p>

<p>Y una vez dicho esto, releo algo que ya sabíamos: OS X Snow Leopard sólo es para máquinas Intel de 64 bits. No va en PowerPC&#8217;s.</p>

<p>Esta frase que pasará desapercibida para la gran mayoría de usuarios de Mac (Dirán &#8220;Vale, ya lo sabíamos&#8221;), en el mundo PC es como si Microsoft decidiera que el próximo Windows 7 sólo funcionara en Intel Core 2 Duo o Xeon. Es decir, que se cargaría el 80% del mercado. No se qué cuota tendrán los Mac con procesador Intel, pero Apple tiene tan férreo control sobre el mercado de máquinas que se permite hacer esto.</p>

<p>Tengo que releer la frase y volver a pensar en ello, míralo con otras palabras: &#8220;A partir de aquí, o te compras una nueva máquina Apple o no podrás usar ningún programa!&#8221;. Quizás con Paralels o algún tipo de virtualización se podrían ejecutar aplicaciones PowerPC, pero vamos, coincidiréis que &#8220;no es lo mismo&#8221;.</p>

<p>A ver, no quiero que este post tenga connotaciones negativas exclusivamente, puede parecer que es una crítica. Pero leyendo entre líneas también hay algo de admiración. Ojalá otros pudieran hacer lo mismo. Estoy seguro que Vista o Windows 7 serían mucho mejores si Microsoft decidiera suspender el soporte para tecnologías obsoletas que llevan arrastrándose miles de años (en el universo informático, quiero decir).</p>

<p>Está claro que soy un admirador de Apple, no en vano me acabo de &#8220;convertir&#8221; ($$$), pero eso no quita para que sea crítico con algunas cosas de las que hace. Fanaticos Maqueros del mundo, os voy a decir como Pablo Motos: &#8220;Relaaaajate&#8221;. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/09/01/snow-leopard-y-apple-haciendo-cosas-raras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemas con los microformatos</title>
		<link>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/</link>
		<comments>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 01:10:48 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[prog]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=156</guid>
		<description><![CDATA[Leyendo recientemente un artículo de A List Apart sobre HTML 5 y sus nuevas capacidades semánticas, me encontré con el caso de la BBC donde decidió eliminar los microformatos de calendarios (hCalendar) de sus páginas de listado de programación. Y es curioso y alarmante el por qué.

El microformato hCalendar incrusta fechas y eventos basados en [...]]]></description>
			<content:encoded><![CDATA[<p>Leyendo recientemente un <a href="http://www.alistapart.com/articles/semanticsinhtml5">artículo de <strong>A List Apart</strong> sobre HTML 5</a> y sus nuevas capacidades semánticas, me encontré con el caso de la BBC donde decidió <a href="http://www.bbc.co.uk/blogs/radiolabs/2008/06/removing_microformats_from_bbc.shtml">eliminar los microformatos</a> de calendarios (hCalendar) de sus páginas de listado de programación. Y es curioso y alarmante el por qué.</p>

<p>El microformato hCalendar incrusta fechas y eventos basados en iCalendar. La BBC usaba además el patrón de diseño sobre el tag ABBR, para incluir información relevante para parsear automáticamente alrededor de información para humanos. Por ejemplo:</p>

<pre><code>&lt;p&gt;Mi cumpleaños es el &lt;abbr class="dtstart" title="20090814"&gt;14 de Agosto&lt;/abbr&gt;&lt;/p&gt;
</code></pre>

<p>Lo anterior es un ejemplo de microformato hCalendar incrustado en un ABBR tal como usaba la BBC.</p>

<h2>¿Por qué es malo esto y por eso dejó de usarlo la BBC?</h2>

<p>Pues básicamente, y sorprendentemente, por cuestiones de usabilidad.</p>

<p>Resulta que los microformatos, al usar el atributo &#8220;title&#8221; para almacenar los metadatos, expone visiblemente los mismos al usuario como efecto secundario. El atributo &#8220;title&#8221; en algunos elementos es visible al pasar el ratón por encima en forma de &#8220;tooltip&#8221;. Por ejemplo en los enlaces <code>&lt;a title="Título visible"&gt;</code>, etc. Además, resulta que los programas que leen la pantalla para personas discapacitadas como ciegos, etc, LEEN el contenido del tag title, con lo cual una persona que use un lector de pantalla a voz y pase por el ejemplo anterior diría &#8220;Mi cumpleaños es el veinte millones noventa mil ochocientos catorce catorce de agosto&#8221;.</p>

<p>El artículo de A List Apart es especialmente interesante porque cuestiona en cierta forma a HTML 5. Usa el caso de la BBC para exponer sus argumentos, que son los siguientes:</p>

<h2>Semántica estricta en HTML 5</h2>

<p>HTML 5 marca un hito en los estandares de la red, entre otros por añadir una semántica más estricta en los elementos. Aparecen tags del tipo <code>section</code>, <code>nav</code>, etc, que se pueden usar en lugar de <code>div</code> para añadir semántica al contenido. El artículo cuestiona dos aspectos con gran convicción:</p>

<ul>
<li>La compatibilidad con navegadores antiguos.</li>
<li>La futura expansión semántica del lenguaje.</li>
</ul>

<p>Es decir, se cuestiona el antes y el después de HTML 5. El problema con los navegadores antiguos es grave, aunque se limita a los navegadores de Microsoft éstos representan un amplio porcentaje de los clientes existentes.</p>

<p>Por ejemplo, Internet Explorer (en cualquier versión) no soporta los estilos sobre los nuevos elementos. Por ejemplo:</p>

<pre><code>&lt;style type="text/css"&gt;
    section { color: red; }
&lt;/style&gt;
&lt;section&gt;
    &lt;h1&gt;Esto es la sección principal.&lt;/h1&gt;
&lt;/section&gt;
</code></pre>

<p>La cabecera anterior no saldrá en rojo en Internet Explorer, ya que no aplica los estilos a los elementos que no conoce. Ya hay una solución en JavaScript para esto, como no, pero evidentemente es un gran problema ¿cómo puede un estandard moderno introducir nuevos &#8220;hacks&#8221;? ¿No tenemos bastante con los hacks existentes para CSS en Explorer?</p>

<p>El otro punto de interés es la futura ampliación de la semántica. El autor se basa en que los elementos existentes no son suficientes para dar intención semántica en general, y el lenguaje no permite ampliar dichos elementos. Por ejemplo, HTML 5 introduce elementos como <code>&lt;section&gt;</code>, <code>&lt;header&gt;</code>, <code>&lt;aside&gt;</code>, <code>&lt;figure&gt;</code>, que amplían las posibilidades semánticas, pero el artículo se cuestiona con razón que quizá son pocos elementos y la amplitud que abarca esta apertura semántica es insuficiente.</p>

<p>Como ejemplo, el mismo autor plantea una posibilidad que sería ampliar la semántica del lenguaje en lugar de mediante los tags, por los atributos de éstos. Por ejemplo, mediante <code>&lt;ul navigation="main"&gt;</code> o algo por el estilo.</p>

<p>Os recomiento <a href="http://microformatique.com/?p=83">otros posts del mismo autor</a> para saber más.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/08/12/problemas-con-los-microformatos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spotify se está pasando con la publicidad</title>
		<link>http://www.perezruiz.com/2009/08/11/spotify-se-esta-pasando-con-la-publicidad/</link>
		<comments>http://www.perezruiz.com/2009/08/11/spotify-se-esta-pasando-con-la-publicidad/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 16:55:44 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[Varios]]></category>
		<category><![CDATA[spotify]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=152</guid>
		<description><![CDATA[Ya me extrañaba a mi que fuera tan bonito. Han tardado bastante poco desde que Spotify fuera realmente un buen producto a ser un producto realmente pesado. Me refiero a la publicidad.

Al principio sonaba un anuncio cada muchas canciones. Igual oías dos o tres discos seguidos hasta que aparecía una publicidad, pero poco a poco [...]]]></description>
			<content:encoded><![CDATA[<p>Ya me extrañaba a mi que fuera tan bonito. Han tardado bastante poco desde que Spotify fuera realmente un buen producto a ser un producto realmente pesado. Me refiero a la publicidad.</p>

<p>Al principio sonaba un anuncio cada muchas canciones. Igual oías dos o tres discos seguidos hasta que aparecía una publicidad, pero poco a poco se fueron subiendo de tono. Primero empezaron con la publicidades visuales, los banners de toda la vida pero en versión Desktop. Vale, hasta ahí vale. Podemos minimizar, pero poco a poco empezaron a acelerar los anuncios audibles.</p>

<p>Hasta que ahora es prácticamente insoportable, no se a vosotros, pero me suena no uno, sino DOS anuncios seguidos cada 2 ó 3 canciones&#8230; En fin, no es que quiera ser demasiado quiquilloso, pero a estos niveles ni la radio, en M80 por ejemplo no ponen tantos anuncios. (Si, la comparación de Spotify con una radio está más que justificada).</p>

<p>Además, tampoco es mi intención ponerme quisquilloso, pero la voz que han puesto a los últimos anuncios da pena. Con todos mis respetos, pero parece una chiquita becaria de Cadiz. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/08/11/spotify-se-esta-pasando-con-la-publicidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacOS X Snow Leopard compatible con Exchange</title>
		<link>http://www.perezruiz.com/2009/08/05/macos-x-snow-leopard-compatible-con-exchange/</link>
		<comments>http://www.perezruiz.com/2009/08/05/macos-x-snow-leopard-compatible-con-exchange/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 22:34:14 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[OSX]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=147</guid>
		<description><![CDATA[Según la página de Apple sobre OS X Snow Leopard, éste es compatible con Microsoft Exchange, literalmente según sus palabras:


  &#8220;Con Snow Leopard, ahora el Mac ofrece compatibilidad con Exchange Server 2007 de Microsoft nada más sacarlo de la caja, algo que ni siquiera es posible en los PC con Windows.&#8221;


¡¡¡Ouch!!!  
]]></description>
			<content:encoded><![CDATA[<p>Según la página de Apple sobre OS X Snow Leopard, éste es compatible con Microsoft Exchange, literalmente según sus palabras:</p>

<blockquote>
  <p>&#8220;Con Snow Leopard, ahora el Mac ofrece compatibilidad con Exchange Server 2007 de Microsoft nada más sacarlo de la caja, algo que <strong>ni siquiera es posible en los PC con Windows</strong>.&#8221;</p>
</blockquote>

<p>¡¡¡Ouch!!! <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/08/05/macos-x-snow-leopard-compatible-con-exchange/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Driven Development</title>
		<link>http://www.perezruiz.com/2009/06/14/test-driven-development/</link>
		<comments>http://www.perezruiz.com/2009/06/14/test-driven-development/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 22:38:22 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=131</guid>
		<description><![CDATA[Test Driven Development (TDD), o como se traduce en Español &#8220;Desarrollo Guiado por Pruebas&#8221; es una práctica de programación muy usada en la metodología Agile Development. Podeis encontrar más información en la Wikipedia en Español o en Inglés.

Lo que pretendo en este post es &#8220;guiar&#8221; o &#8220;introducir&#8221; TDD para aquellos que no comprenden del todo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Test_driven_development">Test Driven Development</a> (TDD), o como se traduce en Español &#8220;<a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas">Desarrollo Guiado por Pruebas</a>&#8221; es una práctica de programación muy usada en la metodología Agile Development. Podeis encontrar más información en la Wikipedia en <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas">Español</a> o en <a href="http://en.wikipedia.org/wiki/Test_driven_development">Inglés</a>.</p>

<p>Lo que pretendo en este post es &#8220;guiar&#8221; o &#8220;introducir&#8221; TDD para aquellos que no comprenden del todo el concepto. Para entender TDD, debes saber que requiere escribir las pruebas PRIMERO, no DESPUES, y enfatiza la refactorización para conseguir todo esto. ¿Cómo se pueden escribir las pruebas primero? Si estás acostumbrado a hacer las pruebas (en caso de que las hagas) después de escribir el código, este concepto te será raro. Si las pruebas se hacen después del código, estás comprobando que el código funciona pero dicho código no está inducido por las pruebas, simplemente has hecho un &#8220;test&#8221; para comprobar que lo que has hecho es correcto.</p>

<p>Puede parecer una perogrullada, pero esto no es lo mismo. TDD hace posible que tu código esté guiado por las pruebas inciales, que al fin y al cabo es un conjunto de requerimientos. Es decir, en TDD empiezas primero por definir el comportamiento al que debes adherirte y asegurarte de cumplir estos comportamientos. Al hacer primero los tests, se evitan una serie de comportamientos y se aseguran una serie de ventajas: por ejemplo el sobredimensionamiento del código, sólo implementamos lo suficiente para pasar los test (cumplir los requerimientos) y también obliga al programador primero a entender bien el problema a resolver y a pensar como cliente al enfocarse en los interfaces.</p>

<p>Como se que todo esto está muy bien, pero es difícil entenderlo, voy a hacer un pequeño ejercicio de TDD para que lo comprendais mejor.</p>

<h2>Números de Fibonacci</h2>

<p>Los requerimientos son hacer una clase en C++ con un método que devuelve un número de la serie de Fibonacci. Bueno, tampoco vamos a controlar una central nuclear, así que el ejemplito clásico de la serie de Fibonacci para un ejemplo de TDD es perfecto. He utilizado gcc en OSX, los ejemplos deberían funcionar también en Linux.</p>

<p>Primero tenemos que usar alguna herramienta para hacer los tests. Para este ejemplo yo he creado la mía, que simplemente es una fución &#8220;test&#8221; que le paso una cadena y un &#8220;bool&#8221; como resultado de la comprobación de la prueba. En un entorno real se debería usar una librería de tests, aunque como podeis ver tampoco hace falta nada del otro mundo para hacer una batería de tests.</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &amp;lt;stdio.h&amp;gt;</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> test<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str, <span style="color: #0000ff;">bool</span> pass<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%-11s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pass <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;OK&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;***ERROR***&quot;</span>, str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Fibb f<span style="color: #008080;">;</span>
&nbsp;
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb debe existir.&quot;</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Vale, he incluido la cabecera de mi &#8220;futura&#8221; librería que crea un objeto &#8220;Fibb&#8221;. Como todabía no la he creado (recordad, los test se hacen ANTES del código) ya tengo mi primer requerimiento: &#8220;<em>Fibb debe existir</em>&#8220;.</p>

<p>Como era de esperar, esto falla:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ make
g++    -c -o test.o test.cpp
test.cpp:3:18: error: fibb.h: No such file or directory
test.cpp: In function ‘int main()’:
test.cpp:12: error: ‘Fibb’ was not declared in this scope
test.cpp:12: error: expected `;' before ‘f’
test.cpp:15: error: ‘f’ was not declared in this scope
make: *** [test.o] Error 1
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Se me olvidaba, este es el fichero Makefile:</p>


<div class="wp_syntax"><div class="code"><pre class="make" style="font-family:monospace;"><span style="color: #990000;">.SUFFIXES</span><span style="color: #004400;">:</span>
<span style="color: #990000;">.SUFFIXES</span><span style="color: #004400;">:</span> <span style="color: #004400;">.</span>cpp <span style="color: #004400;">.</span>o
<span style="color: #990000;">.PHONY</span><span style="color: #004400;">:</span> clean
&nbsp;
all<span style="color: #004400;">:</span> test
&nbsp;
test<span style="color: #004400;">:</span> test<span style="color: #004400;">.</span>o fibb<span style="color: #004400;">.</span>o
        <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CXX</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>o test <span style="color: #000088; font-weight: bold;">$^</span>
&nbsp;
clean<span style="color: #004400;">:</span>
        <span style="color: #004400;">-</span>rm <span style="color: #004400;">*.</span>o</pre></div></div>


<p>Y esta es la clase esqueleto para hacer pasar el primer test: Vamos a crear el objeto &#8220;Fibb&#8221;:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* Fichero: fibb.h */</span>
<span style="color: #0000ff;">class</span> Fibb <span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">int</span> dame<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> numero<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* Fichero: fibb.cpp */</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Fibb<span style="color: #008080;">::</span><span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> no<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Bueno, ya tenemos todo en su sitio y ahora vamos a ver qué pasa:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ make
g++    -c -o test.o test.cpp
g++    -c -o fibb.o fibb.cpp
g++ -o test test.o fibb.o
Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Bueno, como suponíamos, ahora pasa el test. Nuestro requerimiento se ha cumplido.</p>

<p>Fijaros que aún no hemos hecho nada para calcular la serie de Fibonacci, estamos haciendo requerimientos y los estamos cumpliendo programando nuestra clase para que pase los test. Esta es la clave del Test Driven Development no hacemos nada aparte de cumplir nuestros tests. Recordad, es Programación Dirigida por Pruebas, son los test los que nos indican qué tenemos que hacer.</p>

<p>Vamos a añadir unos cuantos tests más. Vamos a añadir unos cuantos requerimientos a nuestra &#8220;<em>calculadora fibonacci</em>&#8220;:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &amp;lt;stdio.h&amp;gt;</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> test<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str, <span style="color: #0000ff;">bool</span> pass<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%-11s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pass <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;OK&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;***ERROR***&quot;</span>, str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Fibb f<span style="color: #008080;">;</span>
&nbsp;
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb debe existir.&quot;</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(0) debe ser 0.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(1) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Es importante hacer notar aquí que, obviamente aparte de que cumplan con los detalles del problema, tenemos que procurar hacer los test para que fallen. En nuestro caso, la clase Fibb está vacía, sólo devuelve 0. Nuestro primer requerimiento (fibb de 0 == 0) por razones obvias va a cumplirse, pero a partir de aquí, los demás requerimientos SABEMOS que van a fallar, hacemos los test sabiendo que van a fallar y nuestro cometido es hacer que pasen.</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Fibb.dame(0) debe ser 0.
***ERROR*** Fibb.dame(1) debe ser 1.</pre></div></div>


<p>Como esperábamos, el número 0 de la serie es 0, pero al comprobar el número 1 de la serie no es 1, como debería.</p>

<p>Pues venga, vamos a cumplirlo:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: fibb.cpp */</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Fibb<span style="color: #008080;">::</span><span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> numero<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Ya está. Perfecto. Nuestro programa pasa los tests&#8230;</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ make
g++    -c -o fibb.o fibb.cpp
g++ -o test test.o fibb.o
Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
Twoixter:pruebas josemiguel$</pre></div></div>


<p>Bueno, aquí el lector avezado empezará a decir: &#8220;<em>Espera, espera, no estás programando ninguna serie de Fibonacci, me estás mintiendo</em>&#8220;. No, la respuesta es que <strong>estamos dando respuesta a nuestros requerimientos</strong>.</p>

<p>Si nuestros requerimientos fueran sólamente estos, ya habríamos terminado. No se, por ejemplo para un programa tonto que sólo saque los 2 primeros números de la serie de fibonacci esto bastaría. Las claves son las siguientes:</p>

<ul>
    <li>Nuestra clase funciona <strong>según los requerimientos</strong> indicados.</li>
    <li>Nuestra clase no tiene ninguna funcionalidad extra, con lo cual <strong>no está sobrecargado</strong> con código sobrante.</li>
    <li>Si un futuro programador lee nuestro código, <strong>sabe perfectamente</strong> (por los requerimientos) lo que hace.</li>
</ul>

<p>Vamos a seguir ampliando requerimientos porque &#8220;parece&#8221; que nos falta algo para que sea una serie real de Fibonacci. Vamos a incluir lo siguiente:</p>

<ol>
    <li>Para cualquier número negativo, devuelve -1 (Esto es un poco arbitrario, lo ponemos como requerimiento).</li>
    <li>Para el número 2, debe devolver 1.</li>
    <li>Para el número 3, debe devolver 2.</li>
    <li>Para el número 4, debe devolver 3.</li>
    <li>Para el número 5, debe devolver 5.</li>
</ol>

<p>Venga, manos a la obra. Recordad PRIMERO hacemos los TEST para que FALLEN&#8230;</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: test.cpp */</span>
<span style="color: #339900;">#include &amp;lt;stdio.h&amp;gt;</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> test<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str, <span style="color: #0000ff;">bool</span> pass<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%-11s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pass <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;OK&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;***ERROR***&quot;</span>, str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Fibb f<span style="color: #008080;">;</span>
&nbsp;
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb debe existir.&quot;</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Para cualquier negativo, debe ser -1&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(0) debe ser 0.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(1) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(2) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(3) debe ser 2.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(4) debe ser 3.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(5) debe ser 5.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>&#8230;como era de esperar:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ make
g++    -c -o test.o test.cpp
g++ -o test test.o fibb.o
Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
***ERROR*** Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
***ERROR*** Fibb.dame(2) debe ser 1.
***ERROR*** Fibb.dame(3) debe ser 2.
***ERROR*** Fibb.dame(4) debe ser 3.
***ERROR*** Fibb.dame(5) debe ser 5.
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Vale, tenemos que hacer cumplir estos tests&#8230; así que modificamos el programa principal de esta forma:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: fibb.cpp */</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Fibb<span style="color: #008080;">::</span><span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> numero<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>numero<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">4</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p><strong>¡Pero que estafa es esta! ¡Seguimos sin programar un generador de números de Fibonacci!</strong>. No, esperad, no funciona así&#8230; Estamos cumpliendo los requerimientos, y para los requerimientos que hemos puesto, este programa funciona perfectamente, como lo demuestran los tests:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
OK          Fibb.dame(2) debe ser 1.
OK          Fibb.dame(3) debe ser 2.
OK          Fibb.dame(4) debe ser 3.
OK          Fibb.dame(5) debe ser 5.
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Como veis, hemos pasado todos los tests. Nuestro programa es simple, fácil de entender, y pasa los tests.</p>

<p>Moraleja importante: TDD, o Desarrollo Asistido/Guiado por Pruebas, basa todo en los test al contrario que en la forma tradicional de programación. Si no usaramos TDD, empezaríamos por hacer un generador de números de Fibonacci seguramente de forma recursiva. Nos centraríamos en cosas que no tienen que ver con los requerimientos. En este ejemplo de la serie, insisto, es muy básico pero creo que cumple perfectamente con el objetivo de ver cuán diferente puede ser esta metodología de programación con respecto al método &#8220;clásico&#8221;.</p>

<p>Como veis, los detalles de implementación pasan a un plano secundario y lo importante son los requerimientos, el comportamiento que queremos que tenga nuestro programa. Con una batería de test correcta, con todos los requerimientos bien definidos, la implementación pasa a un segundo plano.</p>

<p>Hablando de requerimientos. Hay un fallo importante en los test, si os fijais, el test de los negativos pone &#8220;<em>Para CUALQUIER negativo</em>&#8220;, y sin embargo sólo comprobamos con menos uno. Vamos a cumplimentar mejor la batería de tests:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: test.cpp */</span>
<span style="color: #339900;">#include &amp;lt;stdio.h&amp;gt;</span>
<span style="color: #339900;">#include &amp;lt;stdlib.h&amp;gt; </span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> test<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str, <span style="color: #0000ff;">bool</span> pass<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%-11s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pass <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;OK&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;***ERROR***&quot;</span>, str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Fibb f<span style="color: #008080;">;</span>
&nbsp;
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb debe existir.&quot;</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Para cualquier negativo, debe ser -1&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(0) debe ser 0.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(1) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(2) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(3) debe ser 2.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(4) debe ser 3.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(5) debe ser 5.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Hemos cambiado el test para <strong>cualquier negativo</strong> incluyendo un número aleatorio. No es estrictamente &#8220;científico&#8221;, porque en una pasada de test no podemos comprobar TODOS los números negativos. Para la mayoría de propósitos, un número aleatorio en un rango suficientemente grande nos asegurará que en cada ejecución de los test tengamos muchas posibilidades de que falle el test.</p>

<p><strong>Moraleja</strong>: Como veis, seguimos enfocados en que los test fallen. Sería una perdida de tiempo en TDD hacer test para cosas que sabemos que funcionan, o cosas redundantes. Al enfocarnos en hacer test que fallen vamos &#8220;dirigiendo&#8221; nuestros esfuerzos a mejorar el desarrollo.</p>

<p>El test de los números negativos, como suponíamos, falla:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
***ERROR*** Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
OK          Fibb.dame(2) debe ser 1.
OK          Fibb.dame(3) debe ser 2.
OK          Fibb.dame(4) debe ser 3.
OK          Fibb.dame(5) debe ser 5.
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Ahora introducimos un concepto importante en TDD, la <strong>refactorización</strong>. Una vez que nuestro código pasa los test, debemos refactorizar. Refactorizar es cambiar la programación por cualquier motivo, por ejemplo para que sea más eficiente, más rápido, o hacer el código más simple, pero siempre teniendo la seguridad de pasar los tests.</p>

<p>En nuestro caso, hacer que valide el test de los negativos no sería una refactorización en sí, puesto que hay un test que falla y tenemos que enfocarnos en que valide. Sí que hacemos una refactorización para hacer que lo que antes era un &#8220;switch&#8221;, pase a ser una tabla.</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: fibb.cpp */</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Fibb<span style="color: #008080;">::</span><span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> numero<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> tabla_fibb<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">3</span>, <span style="color: #0000dd;">5</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000040;">&amp;</span>gt<span style="color: #008080;">;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> tabla_fibb<span style="color: #008000;">&#91;</span>numero<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Vale, hemos cumplido el test de los negativos haciendo que cualquier número menor que 0 devuelva -1. Después también ha habido la refactorización importante de pasar de un switch a una tabla. Ahora todos los tests pasan, incluso el de los negativos:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
OK          Fibb.dame(2) debe ser 1.
OK          Fibb.dame(3) debe ser 2.
OK          Fibb.dame(4) debe ser 3.
OK          Fibb.dame(5) debe ser 5.
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Bien, como decíamos antes, si nuestros requerimientos fueran estos, ya habríamos terminado. <strong>¡Y sin hacer el algoritmo de Fibonacci!</strong>. Merece la pena recapitular lo que hemos visto hasta ahora:</p>

<ul>
    <li>Programar usando Test Driven Development significa &#8220;dar la vuelta&#8221; a la forma de pensar cuando programamos normalmente, ya que PRIMERO se hacen los test (pruebas) en forma de requerimientos.</li>
    <li>Los requerimientos por tanto <strong>deben ser sólidos</strong>, y estar bien fundados ya que nuestro programa va a ser una representación literal de esos requerimientos.</li>
    <li>Los pasos que debemos dar por tanto son: <em>test</em> &gt; <em>implementación</em> &gt; <em>probar test</em> &gt; <em>refactorización</em>. Y así continuamente hasta que todos los requerimientos se cumplan.</li>
</ul>

<p>Para terminar, y como tengo la sensación de que a esta serie de Fibonacci le falta algo, imaginemos que una vez hecho todo lo anterior y ya estamos contentos (nuestro programa cumple con los requerimientos), viene el &#8220;jefe&#8221; y nos dice:</p>

<ul>
    <li>No, no, hasta 5 no, debe sacar los números de la serie hasta 40 como mínimo.</li>
    <li>A ver, a ver, entonces cómo se hace eso?</li>
    <li>Muy fácil, un número &#8220;n&#8221; de la serie es la suma del número &#8220;n-1&#8243; más &#8220;n-2&#8243;&#8230;</li>
    <li>Ahhhh&#8230; Vale.</li>
</ul>

<p>Entonces, hacemos el siguiente test:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: test.cpp */</span>
<span style="color: #339900;">#include &amp;lt;stdio.h&amp;gt;</span>
<span style="color: #339900;">#include &amp;lt;stdlib.h&amp;gt;</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> test<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str, <span style="color: #0000ff;">bool</span> pass<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%-11s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pass <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;OK&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;***ERROR***&quot;</span>, str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Fibb f<span style="color: #008080;">;</span>
&nbsp;
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb debe existir.&quot;</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Para cualquier negativo, debe ser -1&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(0) debe ser 0.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(1) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(2) debe ser 1.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(3) debe ser 2.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(4) debe ser 3.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb.dame(5) debe ser 5.&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">20</span><span style="color: #008080;">;</span>
    test<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Fibb de 'n' debe ser fibb(n-1) + fibb(n-2)&quot;</span>, f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> f.<span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Incluimos un último test donde decimos exactamente eso, que el número &#8220;n&#8221; de la serie es la suma del n-1 más n-2. Si corremos la batería de tests, ocurre esto:</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
OK          Fibb.dame(2) debe ser 1.
OK          Fibb.dame(3) debe ser 2.
OK          Fibb.dame(4) debe ser 3.
OK          Fibb.dame(5) debe ser 5.
OK          Fibb de 'n' debe ser fibb(n-1) + fibb(n-2)
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p><strong>¿Comorrrlll? ¿Ha pasado la prueba?</strong> Bieennn&#8230; Nuestro programa funciona para cualquier número natural positivo con sólo una tabla de 6 números. Bueno, evidentemente, esto está mal. Y está mal porque si recordais, hemos dicho antes que los tests tienen que hacerse PARA QUE FALLEN inicialmente. Si no, pasan estas cosas.</p>

<p><strong>Nota</strong>: La explicación de por qué pasa el test debe ser evidente, pero si no, lo que ocurre es que nuestra función devuelve 0 para cualquier número mayor de 5. Entonces, 0 = 0 + 0.</p>

<p><strong>Tenemos MAL el test.</strong></p>

<p>Deberíamos replantear el test de esta forma: &#8220;<em>Fibb de &#8216;n&#8217; debe ser fibb(n-1) + fibb(n-2) y <strong>mayor que cero</strong></em>&#8220;.</p>


<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">Twoixter:pruebas josemiguel$ ./test
OK          Fibb debe existir.
OK          Para cualquier negativo, debe ser -1
OK          Fibb.dame(0) debe ser 0.
OK          Fibb.dame(1) debe ser 1.
OK          Fibb.dame(2) debe ser 1.
OK          Fibb.dame(3) debe ser 2.
OK          Fibb.dame(4) debe ser 3.
OK          Fibb.dame(5) debe ser 5.
***ERROR*** Fibb de 'n' debe ser igual a fibb(n-1) + fibb(n-2) y &amp;gt;0
Twoixter:pruebas josemiguel$ _</pre></div></div>


<p>Vale, ahora podemos ponernos manos a la obra:</p>


<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* fichero: fibb.cpp */</span>
<span style="color: #339900;">#include &quot;fibb.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Fibb<span style="color: #008080;">::</span><span style="color: #007788;">dame</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> numero<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>numero <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> dame<span style="color: #008000;">&#40;</span>numero<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> dame<span style="color: #008000;">&#40;</span>numero<span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<p>Que es un algoritmo de Fibonacci más o menos estandard. (Bueno, no me critiqueis mucho, esto es un post sobre Test Driven Develpment, no sobre cómo hacer un algoritmo de Fibonacci) <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p>De hecho, habiendo refactorizado lo anterior, pasan todos los test. Ahora podríamos hacer un test que comprobara uno a uno todos los números de la serie hasta el 40, que es nuestro tope.</p>

<p>Espero que hayais leido hasta aquí, este ha sido uno de mis posts más largos. La intención ha sido hacer entender de una forma práctica las bases de TDD. En futuros posts, pondré enlaces más interesantes sobre frameworks y librerías que podemos usar para hacer tests y usaré otros lenguajes aparte de C++, lo prometo. <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/06/14/test-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails &#8211; Sexo, Drogas y Rock&#8217;n&#039;roll</title>
		<link>http://www.perezruiz.com/2009/06/05/ruby-on-rails-sexo-drogas-y-rocknroll/</link>
		<comments>http://www.perezruiz.com/2009/06/05/ruby-on-rails-sexo-drogas-y-rocknroll/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 22:32:55 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=125</guid>
		<description><![CDATA[La última moda en programación Web se llama Ruby on Rails. No descubro nada a estas alturas, Ruby on Rails es un entorno perfecto para desarrollar proyectos web, como intentan copiar otros frameworks con mayor o menor éxito.

Me incita a escribir esta entrada (y de ahí el título del post) una comparativa que me viene [...]]]></description>
			<content:encoded><![CDATA[<p>La última moda en programación Web se llama Ruby on Rails. No descubro nada a estas alturas, <a href="http://rubyonrails.org/">Ruby on Rails</a> es un entorno perfecto para desarrollar proyectos web, como <a href="http://www.symfony-project.org/">intentan</a> <a href="http://cakephp.org/">copiar</a> otros <a href="http://www.akelos.org/">frameworks</a> con mayor o menor éxito.</p>

<p>Me incita a escribir esta entrada (y de ahí el título del post) una comparativa que me viene a la cabeza con la época hippie de los años 60. La revolución sexual de aquellos años contrastaba con el régimen conservador y se reveló contra él, de la misma forma casi que Ruby se revela contra otros lenguajes más &#8220;estrictos&#8221;. La comparativa viene al caso porque al igual que los abusos de aquellos años de droga, sexo y rock&#8217;n'roll con Ruby también se pueden cometer excesos.</p>

<p>Ruby introduce no sólo un lenguaje de programación, sino toda una forma de hacer las cosas, &#8220;The Ruby Way&#8221; que llaman los entendidos. Esto es cierto, sin llegar a ser un cambio de paradigma, se tiene que pensar de forma diferente en Ruby. Todos los manuales existentes insisten en que el propio lenguaje te fuerza a hacer las cosas de forma diferente, pero continuamente veo que no es así.</p>

<p>Por ejemplo, continuamente veo código Ruby que mantiene los mismos patrones de programación de&#8230; pongamos PHP. Por ejemplo:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> temp_dirname
  chars = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#123;</span>a b c d e f g h i j k l m n o <span style="color:#CC0066; font-weight:bold;">p</span> q r s t u v w x y z<span style="color:#006600; font-weight:bold;">&#125;</span>
  rand_max = chars.<span style="color:#9900CC;">size</span>
  ret = <span style="color:#996600;">&quot;&quot;</span> 
  16.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> ret <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; chars<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span>rand_max<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  ret
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>El método anterior devuelve una cadena aleatoria para ser usada como nombre en un fichero temporal. Evidentemente, desde la primera línea se ve que se ha programado con la intención de seguir un patrón no-ruby, creando una variable temporal &#8220;ret&#8221; como cadena para ir concatenando caracteres aleatoriamente de la tabla abecedario creada anteriormente. Lo único &#8220;Ruby-Way&#8221; del código anterior es el uso de <code>16.times</code>, pero seguro que si Ruby tuviera un <code>for(x;x&lt;y;x++)</code> se usaría.</p>

<p>Esto no se tiene que hacer así. Ruby da para más. El problema de lo anterior es que no queda &#8220;claro&#8221; desde un primer momento lo que hace el método. Si, seguro que gastando 5 minutos de tiempo se llega a la conclusión de lo que hace, y tienes que ser un programador medio avezado para ver instantáneamente lo que hace la operación <code>chars[rand(rand_max)]</code>.</p>

<p>Lo anterior podría haberse escrito de esta forma:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'digest/md5'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> temp_dirname
  <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">Digest::MD5</span>.<span style="color:#9900CC;">hexdigest</span> <span style="color:#CC0066; font-weight:bold;">rand</span>.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span>0..15<span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>De acuerdo, aquí hemos introducido la librería &#8220;digest/md5&#8243; para crear una cadena hash a partir de un número aleatorio, y luego extraemos los 16 primeros carácteres. Pero aún así, es más fácil de entender que las 5 líneas anteriores.</p>

<p>Podemos evolucionar más y hacerlo aún más &#8220;Rubyist&#8221; usando varios conceptos exclusivos de Ruby. Vamos a eliminar la dependencia de la librería de MD5 y volvemos al array abecedario, pero vamos a hacerlo DRY (Don&#8217;t Repeat Yourself) y KISS (Kept It Simple, Stupid):</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">Array</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> any
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span>length<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> length
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span>
  @@temptemp = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#123;</span>a b c d e f g h i j k l m n o <span style="color:#CC0066; font-weight:bold;">p</span> q r s t u w x y z<span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> tempname!
    16.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#0000FF; font-weight:bold;">self</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> @@temptemp.<span style="color:#9900CC;">any</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<p>OK, nos aprovechamos de poder &#8220;extender&#8221; los objetos nativos de Ruby para añadir dos métodos a las clases &#8220;Array&#8221; y &#8220;String&#8221;. En &#8220;Array&#8221;, añadimos el método &#8220;any&#8221; que nos devuelve, aleatoriamente cualquier elemento de un array. por ejemplo:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>, <span style="color:#006666;">2</span>, <span style="color:#006666;">3</span>, <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>, <span style="color:#006666;">2</span>, <span style="color:#006666;">3</span>, <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">2</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>, <span style="color:#006666;">2</span>, <span style="color:#006666;">3</span>, <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">4</span></pre></div></div>


<p>Esto es DRY, hemos ampliado la clase Array para devolver cualquier elemento aleatorio de cualquier array. Por ejemplo:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#CC0066; font-weight:bold;">String</span>.<span style="color:#9900CC;">methods</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;display&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#CC0066; font-weight:bold;">String</span>.<span style="color:#9900CC;">methods</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;untaint&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#CC0066; font-weight:bold;">String</span>.<span style="color:#9900CC;">methods</span>.<span style="color:#9900CC;">any</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;private_class_method&quot;</span></pre></div></div>


<p>Después, hemos ampliado la clase String para añadir un método llamado &#8220;tempname&#8221; que nos añade, a cualquier string, una cadena aleatoria (basada en el Array#any anterior). Por ejemplo:</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;&quot;</span>.<span style="color:#9900CC;">tempname</span>!
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;tyhbijuqhhjednmr&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;/tmp/&quot;</span>.<span style="color:#9900CC;">tempname</span>!
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;/tmp/nykfurjyunojqykj&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#996600;">&quot;/var/lib/temp/&quot;</span>.<span style="color:#9900CC;">tempname</span>!
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;/var/lib/temp/rdysjeymslkqwfar&quot;</span></pre></div></div>


<p>Lo de incluir una exclamación al final de <code>tempname!</code> es un consenso que usa Ruby de incluir una exclamación al final de los métodos que modifican de alguna forma el objeto sobre el que actua (vamos, que no devuelve nada, sino que modifica el propio objeto). Por otra parte, es como otro carácter y forma parte del nombre del método.</p>

<p>La conclusión de este post es que si te propones aprender Ruby, intentes mirar más allá de la sintaxis. &#8220;Code is Poetry&#8221;, como <a href="http://wordpress.org/">dirían algunos</a>, y esto es mucho más verdad en Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/06/05/ruby-on-rails-sexo-drogas-y-rocknroll/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pasa en las mejores familias</title>
		<link>http://www.perezruiz.com/2009/05/29/pasa-en-las-mejores-familias/</link>
		<comments>http://www.perezruiz.com/2009/05/29/pasa-en-las-mejores-familias/#comments</comments>
		<pubDate>Fri, 29 May 2009 11:41:12 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Varios]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=122</guid>
		<description><![CDATA[Si no, mirad la siguiente imagen:



Definitivamente, alguien debería enseñar a Google qué es UTF-8.
]]></description>
			<content:encoded><![CDATA[<p>Si no, mirad la siguiente imagen:</p>

<p><img class="alignnone size-full wp-image-123" title="error_google" src="http://www.perezruiz.com/wp-content/uploads/2009/05/error_google.gif" alt="error_google" width="572" height="267" /></p>

<p>Definitivamente, alguien debería enseñar a Google qué es UTF-8.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/05/29/pasa-en-las-mejores-familias/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A veces veo canciones prohibidas</title>
		<link>http://www.perezruiz.com/2009/03/05/a-veces-veo-canciones-prohibidas/</link>
		<comments>http://www.perezruiz.com/2009/03/05/a-veces-veo-canciones-prohibidas/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 00:06:13 +0000</pubDate>
		<dc:creator>Twoixter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.perezruiz.com/?p=115</guid>
		<description><![CDATA[Si, si, a veces veo&#8230; por que no puedo escucharlas. Jejeje. Decía en mi blog hace unos días, que Spotify fué obligada a limitar las escuchas de ciertos discos y canciones según el país de origen, incluso a borrar canciones completamente &#8220;a petición de las casas discográficas&#8221;.

Bueno, he visto un caso de canción borrada&#8230;  [...]]]></description>
			<content:encoded><![CDATA[<p>Si, si, a veces veo&#8230; por que no puedo escucharlas. Jejeje. Decía en mi blog <a href="http://www.perezruiz.com/2009/02/09/el-caduco-negocio-de-la-musica/">hace unos días</a>, que Spotify fué obligada a limitar las escuchas de ciertos discos y canciones según el país de origen, incluso a borrar canciones completamente &#8220;a petición de las casas discográficas&#8221;.</p>

<p>Bueno, he visto un caso de canción borrada&#8230; <img src='http://www.perezruiz.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p><img class="alignnone size-full wp-image-116" title="lisa" src="http://www.perezruiz.com/wp-content/uploads/2009/03/lisa.gif" alt="lisa" width="547" height="347" /></p>

<p>Como podeis ver en la captura, la canción &#8220;It&#8217;s Oh So Quiet&#8221; de Lisa Ekdahl ha sido &#8220;borrada&#8221; a petición del artista o la discográfica. La verdad, no me quita el sueño que esa canción en concreto sea borrada, pero no deja de ser curioso ver la aplicación del &#8220;borrado&#8221; por ti mismo.</p>

<p>¿Tendrá que ver Anaïs Anaïs (Cacharel) con algo de esto? Podeis apostar lo que sea&#8230;</p>

<p><strong>Actualización</strong>: ¡Acabo de ver más canciones prohibidas! En este caso si que me afecta más, hay un disco concreto de Herbie Hancock que tiene al menos 6 canciones prohibidas, entre ellas &#8220;Watermelon Man&#8221; y &#8220;Maiden Voyage&#8221;, dos grandes éxitos que curiosamente SI que se pueden escuchar en otras recopilaciones.</p>

<p>Por ejemplo, en la captura que pongo a continuación marco con una flecha roja las canciones que están prohibidas, y en verde las mismas pero en otros discos recopilatorios. Algunas al parecer son versiones diferentes, por la duración (una en concreto es un directo). En este caso es más difícil que en el caso de &#8220;It&#8217;s Oh So Quiet&#8221; saber por qué están prohibidas. Al menos yo no encuentro la explicación para bloquear una canción de un recopilatorio cuando la canción original está disponible (&#8221;Watermelon Man&#8221; es del disco &#8220;<a href="http://open.spotify.com/album/5XPra3iq6ixhFdJJgxhGGw">Head Hunters</a>&#8220;).</p>

<p><img class="alignnone size-full wp-image-119" title="herbie" src="http://www.perezruiz.com/wp-content/uploads/2009/03/herbie.gif" alt="herbie" width="547" height="854" /></p>

<p>¿Estarán las mismas restricciones activas en la versión &#8220;Premium&#8221;?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezruiz.com/2009/03/05/a-veces-veo-canciones-prohibidas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
