<?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>Diario de Programación &#187; métricas</title>
	<atom:link href="http://blog.chuidiang.com/tag/metricas/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chuidiang.com</link>
	<description>Programación e informática en general</description>
	<lastBuildDate>Wed, 25 Jan 2012 23:17:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Sobre constructores, atributos y herencias.</title>
		<link>http://blog.chuidiang.com/2009/11/20/sobre-constructores-atributos-y-herencias/</link>
		<comments>http://blog.chuidiang.com/2009/11/20/sobre-constructores-atributos-y-herencias/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 16:28:25 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[herencia]]></category>
		<category><![CDATA[métricas]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=682</guid>
		<description><![CDATA[&#160; Un peque&#241;o &#34;bug&#34; con el que me he tropezado el otro d&#237;a. Sup&#243;n una clase padre abstracta en la que desde el constructor se llama al m&#233;todo abstracto. public abstract ClasePadre { &#160;&#160; public ClasePadre() { &#160;&#160;&#160;&#160;&#160; &#8230; &#160;&#160;&#160;&#160;&#160; inicializa(); &#160;&#160;&#160;&#160;&#160; &#8230; &#160;&#160; } &#160;&#160; public abstract void inicializa() { &#160;&#160; } } Ahora [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Un peque&ntilde;o &quot;bug&quot; con el que me he tropezado el otro d&iacute;a. Sup&oacute;n una clase padre abstracta en la que desde el constructor se llama al m&eacute;todo abstracto.</p>
<blockquote>
<p>public abstract ClasePadre {<br />
&nbsp;&nbsp; public ClasePadre() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inicializa();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; public abstract void inicializa() {<br />
&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>Ahora imagina que hacemos una clase hija, mal hecha, tal que as&iacute;</p>
<blockquote>
<p>public class ClaseHija extends ClasePadre {<br />
&nbsp;&nbsp; private UnAtributo atributo = null;</p>
<p>&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp; public void inicializa() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atributo = new UnAtributo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>Simplemente hemos sobreescrito el m&eacute;todo inicializa() que nos obliga el padre y lo aprovechamos para inicializar un atributo que inicialmente es null. A partir de aqu&iacute;, nuestro c&oacute;digo se fia de que ese atributo est&eacute; inicializado. Pues bien, est&aacute; mal. Veamos el orden de construcci&oacute;n cuando hacemos new ClaseHija()</p>
<ol>
<li>Primero java llama al constructor del padre. Este llama a inicializar() y se crea el atributo de la clase hija.</li>
<li>Luego java asigna a los atributos de la clase hija los valores definidos al declararlos, o sea, pone atributo a null.</li>
<li>Finalmente java llama al constructor de la clase hija.</li>
</ol>
<p>El punto 2 es el que nos da los problemas, resulta que en el punto 1 se inicializa atributo d&aacute;ndole un valor y en el paso 2 se vuelve a poner a null. &iexcl;&iexcl; El atributo queda sin inicializar a pesar de que le hemos hecho un new !!. Nos cost&oacute; un buen rato dilucidar por qu&eacute; algo de lo que se hac&iacute;a el new, un rato despu&eacute;s era null.</p>
<p>Pues bien, esto nos ha pasado, y nos ha pasado por pasar de las m&eacute;tricas. Hay una que dice <a href="http://pmd.sourceforge.net/rules/design.html">ConstructorCallOverridableMethod</a>, en la que salta un error si un constructor llama a un m&eacute;todo que no es final, es decir, que las clases hijas podr&iacute;an sobreescribir y hacer que la clase padre no quedara bien inicializada. Esto no es exactamente as&iacute; en este ejemplo, pero est&aacute; claro que no es buena idea que un constructor llama a m&eacute;todos que se pueda o, como en este ejemplo, se deban sobreescribir.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/11/20/sobre-constructores-atributos-y-herencias/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sonar: viene &#8230; y se va.</title>
		<link>http://blog.chuidiang.com/2009/09/23/sonar-viene-y-se-va/</link>
		<comments>http://blog.chuidiang.com/2009/09/23/sonar-viene-y-se-va/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 20:57:03 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[sonar]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[integración continua]]></category>
		<category><![CDATA[métricas]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=657</guid>
		<description><![CDATA[&#160; Hace un tiempo instal&#233; y prob&#233; Sonar, una estupenda herramienta que genera un informe muy vistoso y c&#243;mo de usar sobre las m&#233;tricas de nuestro c&#243;digo, Pero al final tuve que abandonarlo. El compilado con maven generando el informe era muy lento y el servidor web de sonar acababa dando timeout por la carga [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Hace un tiempo instal&eacute; y prob&eacute; <a href="http://blog.chuidiang.com/2009/02/05/pegas-con-sonar/">Sonar</a>, una estupenda herramienta que genera un informe muy vistoso y c&oacute;mo de usar sobre las m&eacute;tricas de nuestro c&oacute;digo, Pero al final tuve que abandonarlo. El compilado con maven generando el informe era muy lento y el servidor web de sonar acababa dando timeout por la carga a la que se ve&iacute;a sometido. Al final el compilado con maven fallaba por este timeout y eso me hac&iacute;a totalmente imposible integrarlo con <a href="http://blog.chuidiang.com/2008/09/18/hudson/">hudson</a>, para obtener los informes actualizados todas las noches.</p>
<p>El otro d&iacute;a me dio por revisar c&oacute;mo iba el desarrollo de Sonar, qu&eacute; nuevas versiones hab&iacute;an sacado, qu&eacute; problemas hab&iacute;an resuelto &#8230; y me resulto interesante que hab&iacute;an corregido/a&ntilde;adido una nueva &quot;feature&quot;, la <a href="http://jira.codehaus.org/browse/SONAR-764">SONAR-764</a>, en la que b&aacute;sicamente dicen que cargan el trabajo en el plugin de sonar para maven en vez de en el servidor web de sonar. Esto tiene pinta de que puede solucionar los problemas de timeout con el servidor de sonar. As&iacute; que a ello, descargar, instalar y probar.</p>
<p>Las primeras pruebas manuales funcionan a la perfecci&oacute;n. Eso s&iacute;, los compilados tardan casi el doble ya que deben generar adem&aacute;s todos los reportes de m&eacute;tricas, pero ya no tengo el problema de timeout y el informe acaba correctamente y se publica en el servidor web de sonar.</p>
<p>Siguiente paso, hacer que Hudson genere con sonar ese informe todas las noches y lo publique. Y ah&iacute; empezaron los problemas. Algunos proyectos tardaban m&aacute;s en compilar, pero lo hac&iacute;an todo bien y el informe se publicaba. Pero otros proyectos, no necesariamente los m&aacute;s grandes, acababan dando una excepci&oacute;n en el compilado, indicando que &quot;Sonar no se puede ejecutar&quot; y un NullPointerException en los MOJOS de maven. Tras unas investigaciones r&aacute;pidas, no llegu&eacute; a ninguna conclusi&oacute;n ni ning&uacute;n arreglo. El mismo proyecto compilado manualmente en el sitio donde lo hace hudson funciona, pero si lo hace hudson no funciona.</p>
<p>As&iacute; que mi gozo en un pozo. Desinstalar sonar y esperar a una nueva ocasi&oacute;n.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/09/23/sonar-viene-y-se-va/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Métricas: A veces el remedio es peor que la enfermedad</title>
		<link>http://blog.chuidiang.com/2009/04/16/metricas-a-veces-el-remedio-es-peor-que-la-enfermedad/</link>
		<comments>http://blog.chuidiang.com/2009/04/16/metricas-a-veces-el-remedio-es-peor-que-la-enfermedad/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 17:26:53 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[métricas]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=561</guid>
		<description><![CDATA[&#160; Cuando somos novatos y empezamos a codificar, el c&#243;digo no es todo lo bueno que debiera ser, tendemos a hacer clases muy grandes y m&#233;todos muy grandes. En alg&#250;n momento, alguien nos dice que debemos cumplir m&#233;tricas, nos cuentan que no podemos tener una complejidad ciclom&#225;tica (igual hasta nos dicen que es eso) mayor [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Cuando somos novatos y empezamos a codificar, el c&oacute;digo no es todo lo bueno que debiera ser, tendemos a hacer clases muy grandes y m&eacute;todos muy grandes. En alg&uacute;n momento, alguien nos dice que debemos cumplir m&eacute;tricas, nos cuentan que no podemos tener una complejidad ciclom&aacute;tica (igual hasta nos dicen que es eso) mayor que X, que nuestras clases no pueden tener m&aacute;s de Y m&eacute;todos, etc, etc.</p>
<p>Con buena voluntad, nos ponemos a tratar de cumplir esas m&eacute;tricas, pero las prisas y la comodidad hacen que quiz&aacute;s no las cumplamos a rajatabla. Nuestro c&oacute;digo estar&aacute; un poco mejor, porque nos preocupamos de ellas, pero no las cumplimos al 100%.</p>
<p>M&aacute;s adelante, alg&uacute;n espabilidado, descubre que algo como <a href="http://www.chuidiang.com/chuwiki/index.php?title=Maven_y_PMD">maven+pmd</a> puede hacer que si el c&oacute;digo no pasa m&eacute;tricas directamente no compile y adem&aacute;s pmd tiene un mont&oacute;n de m&eacute;tricas. As&iacute; que nuestro c&oacute;digo deja de compilar y no nos queda m&aacute;s remedio que arreglarlo y cumplir estrictamente las m&eacute;tricas.</p>
<p>Conseguido, hemos arreglado nuestro c&oacute;digo y pasa todas las m&eacute;tricas &#8230; y ah&iacute; es donde podemos encontrarnos el problema. Todas las m&eacute;tricas salen de alg&uacute;n sitio y est&aacute;n pensadas para que nuestro c&oacute;digo sea m&aacute;s legible, tenga menos errores, sea m&aacute;s eficiente, m&aacute;s mantenible, etc. Es fundamental saber qu&eacute; es lo que hay detr&aacute;s de cada una de las m&eacute;tricas al intentar hacer/corregir el c&oacute;digo para que pase esa m&eacute;trica. No vale con hacer cualquier cosa para cumplir. Y pongo varios ejemplos:</p>
<ul>
<li>Las clases no pueden tener demasiados m&eacute;todos ni atributos. &iquest;Qu&eacute; hay en el fondo de esta m&eacute;trica?. En el fondo est&aacute; que en un buen dise&ntilde;o orientado a objetos cada clase debe tener una y s&oacute;lo una responsabilidad bien definida. Si una clase tiene muchos m&eacute;todos y atributos, posiblemente tiene demasiadas responsabilidades y debemos partirla en varias clases, pero podemos hacerlo bien, replanteando el dise&ntilde;o para que esa clase reparta sus responsabilidades adecuadamente en varias, o podemos hacerlo mal, por ejemplo haciendo tres o cuatro clases que heredan unas de otras y repartiendo m&eacute;todos y atributos entre ellas. Al final s&oacute;lo instanciamos la m&aacute;s hija de todas, que hereda todos los m&eacute;todos y atributos de sus padres, el c&oacute;digo nos sigue funcionando igual que antes, pasa m&eacute;tricas y tenemos una clase con todo, que es lo que quer&iacute;amos. Y si resulta que esa clase tiene muchas constantes, pues las metemos en un array de Object y en vez de acceder a la constante por su nombre, accedemos por su &iacute;ndice del array: hemos eliminado 27 constantes por un &uacute;nico arrray con 27 valores. Obviamente, no podemos definir los indices del array en constantes porque nos salta la m&eacute;trica, as&iacute; que usamos directamente el &iacute;ndice en nuestro c&oacute;digo.</li>
<li>La complejidad ciclom&aacute;tica no puede ser muy alta. Obviamente, el objetivo final es que no haya c&oacute;digo muy rebuscado y dif&iacute;cil de testear. Un switch-case con muchos case, por simples que sean, no pasa esta m&eacute;trica. Si queremos hacerlo bien, debemos ver si hay una forma l&oacute;gica de hacer eso sin un switch-case, como en este <a href="http://blog.chuidiang.com/2009/01/23/maravilloso-codigo/">c&oacute;digo maravilloso</a>, que puede reemplazarse por una sola l&iacute;nea (si acaso dentro de un if). Si el switch-case realmente es inevitable y sencillo, deber&iacute;amos saltarnos la regla en este caso concreto. Pero claro, tambi&eacute;n podemos hacerlo mal, hago el switch-case con tres o cuatro cases y en el default llamo a otro m&eacute;todo que a su vez trata otros tres o cuatro cases con otro default que llama a otro m&eacute;todo&#8230;. Y as&iacute; hasta que mi clase se pasa de m&eacute;todos, entonces hago una clase hija con otro m&eacute;todo que trata otros tres o cuatro cases&#8230;. Imagina el c&oacute;digo maravilloso del enlace anterior con el switch-case repartido en varios m&eacute;todos y unas clases hijas de otras. &iexcl;&iexcl; buff !!.</li>
<li>&iquest;A alguien se le ocurre alguna m&eacute;trica m&aacute;s y el estropicio adecuado para pasarla?</li>
</ul>
<p>Al final, tenemos un estupendo c&oacute;digo que pasa todas las m&eacute;tricas que debe pasar, pero que es enrevesado como el s&oacute;lo y no hay quien entienda. Desgraciadamente, la mayor&iacute;a de los ejemplos que he puesto son reales y los he visto en c&oacute;digo.</p>
<p>Nuevamente, el manifiesto &aacute;gil, en su principio &quot;<a href="http://blog.chuidiang.com/2008/08/10/manifiesto-agil-personas-sobre-procedimientos/">Personas sobre procedimientos</a>&quot;, tiene toda la raz&oacute;n. Cuando hay programadores no muy expertos, antes de ponerles una herramienta/procedimiento (cumplir m&eacute;tricas o no compila), es mejor darles una formaci&oacute;n, contarles las m&eacute;tricas, no lo que significa cada m&eacute;tricas, sino por qu&eacute; est&aacute; esa m&eacute;tricas ah&iacute;. Hay que ense&ntilde;arles c&oacute;mo se corrigen correctamente las m&aacute;s cr&iacute;ticas o frecuentes. Es mucho mejor preparar a la gente, que limitarse a la herramienta. De hecho, preparando a la gente y no usando la herramienta saldr&aacute; el c&oacute;digo mucho mejor que no preparando a la gente y poniendo la herramienta. Quiz&aacute;s no cumpla todas las m&eacute;tricas estrictamente, pero el c&oacute;digo ser&aacute; bastante mejor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/04/16/metricas-a-veces-el-remedio-es-peor-que-la-enfermedad/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pegas con sonar</title>
		<link>http://blog.chuidiang.com/2009/02/05/pegas-con-sonar/</link>
		<comments>http://blog.chuidiang.com/2009/02/05/pegas-con-sonar/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 18:18:52 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[métricas]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=489</guid>
		<description><![CDATA[&#160; Como de todos es sabido, soy un &#34;pupas&#34; y las cosas nunca me funcionan bien a la primera ni a la segunda. Coment&#233; hace unos d&#237;as que hab&#237;a instalado y probado sonar. Las primeras pruebas fueron bastante bien, pero con el uso me he ido encontrando las pegas. Realmente, pegas no tiene muchas, en [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Como de todos es sabido, soy un &quot;pupas&quot; y las cosas nunca me funcionan bien a la primera ni a la segunda. Coment&eacute; hace unos d&iacute;as que <a href="http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/">hab&iacute;a instalado y probado sonar</a>. Las primeras pruebas fueron bastante bien, pero con el uso me he ido encontrando las pegas.</p>
<p>Realmente, pegas no tiene muchas, en realidad, s&oacute;lo le he visto una, pero molesta bastante.</p>
<p>El plugin de sonar para maven compila nuestro proyecto y pasa todas las m&eacute;tricas. Luego, se pone a insertar en la base de datos de sonar toda esa informaci&oacute;n. Durante ese tiempo, el servidor web de sonar se queda bastante pillado y responde muy lentamente. El problema es que en ese ordenador <a href="http://blog.chuidiang.com/2008/11/22/trac-redmine/">tenemos tambi&eacute;n instalado redmine</a>, <a href="http://blog.chuidiang.com/2008/10/21/jugando-con-archiva/">archiva</a> y <a href="http://blog.chuidiang.com/2008/09/18/hudson/">hudson</a>. Todas esas &quot;web&quot; dejan de responder o responden muy mal mientras se est&aacute;n insertando estad&iacute;sticas en la base de datos.</p>
<p>La siguiente pega, que es m&aacute;s de lo mismo, es que el plugin de sonar para maven tambi&eacute;n intenta acceder a la web de sonar. No s&eacute; el motivo exacto, pero me estoy temiendo que es para avisar al servidor de sonar de que hay nuevas estad&iacute;sticas en base de datos y empiece e echar unas cuentas, organizar los datos o algo. El caso es que cuando el plugin de maven termina, el servidor sonar puede tirarse diez u once minutos &quot;procesando estad&iacute;sticas&quot;, seg&uacute;n pone en la web. Durante ese tiempo, todo el ordenador va muy lento y dejan de responder el hudson, el redmine y el archiva.</p>
<p>Y otra pega m&aacute;s, que viene a ser lo mismo, es que cuando el plugin de maven intenta acceder a la web de sonar, tiene para mi gusto un timeout muy corto, dando error r&aacute;pidamente si no consigue conectarse. Basta con que pille a Hudson compilando para que aquello tenga ciertas probabilidades de error en la conexi&oacute;n. Y no te digo si le pilla procesando estad&iacute;sticas del mismo sonar de un proyecto anterior. Ah&iacute; es imposible conectarse y hay que esperar. Esta pega es realmente gorda, porque me impide meter el plugin de sonar en el hudson, de forma que adem&aacute;s del compilado nocturno, se calculen las m&eacute;tricas nocturnas. El compilado del primer proyecto funciona o no, seg&uacute;n le de, pero los dem&aacute;s nunca funcionan.</p>
<p>Total, que voy a tener que agenciarme otro pc/estaci&oacute;n de trabajo para instalar exclusivamente sonar. Y aun as&iacute;, quiz&aacute;s hudson no pueda publicar las estad&iacute;sticas si pilla a sonar &quot;procesando&quot; informaci&oacute;n.</p>
<p>Ah, el ordenador no es lo m&aacute;s mejor del mundo, pero tampoco es viejo. Supongo que tendr&eacute; que probar en un linux en vez de un windows, o quiz&aacute;s es una estaci&oacute;n de trabajo solaris.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/02/05/pegas-con-sonar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acciones adicionales al salvar un fichero con Eclipse</title>
		<link>http://blog.chuidiang.com/2009/02/01/acciones-adicionales-al-salvar-un-fichero-con-eclipse/</link>
		<comments>http://blog.chuidiang.com/2009/02/01/acciones-adicionales-al-salvar-un-fichero-con-eclipse/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 13:23:04 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[métricas]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=480</guid>
		<description><![CDATA[&#160; Un compa&#241;ero me mostr&#243; una caracter&#237;stica interesante de eclipse. Es posible configurarlo para que cada vez que demos &#34;salvar&#34; a uno de nuestros ficheros java, realice en &#233;l algunas acciones que le indiquemos: arreglar los imports, darle formato al c&#243;digo, poner las llaves en todos los bloques if, while, for aunque no sean necesarios, [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Un compa&ntilde;ero me mostr&oacute; una caracter&iacute;stica interesante de <a href="http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Eclipse">eclipse</a>. Es posible configurarlo para que cada vez que demos &quot;salvar&quot; a uno de nuestros ficheros java, realice en &eacute;l algunas acciones que le indiquemos: arreglar los imports, darle formato al c&oacute;digo, poner las llaves en todos los bloques if, while, for aunque no sean necesarios, eliminar variables locales o privadas que no se usan, etc, etc.</p>
<p>A todo esto se accede desde &quot;window&quot; -&gt; &quot;preferences&quot; -&gt; &quot;java&quot; -&gt; &quot;editor&quot; -&gt; &quot;save actions&quot; (en eclipse versi&oacute;n 3.4.1). Ah&iacute; nos muestra una ventana con un mont&oacute;n de acciones que se pueden hacer, junto con un ejemplo de texto java para que veamos c&oacute;mo afecta.</p>
<p>Hace poco, coment&eacute; que <a href="http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/">he instalado Sonar</a> y viendo algunas de las m&eacute;tricas que tiene en cuenta, veo que muchas pueden cumplirse sin dificultad s&iacute;mplemente configurando eclipse con estas opciones. Por ejemplo, Sonar considera incorrecto (warning) no poner llaves en un if, else o bucle que s&oacute;lo tenga una l&iacute;nea. Poniendo esta opcion, no solo nuestros nuevos ficheros cumplir&aacute;n esta m&eacute;trica, sino que los viejos, seg&uacute;n los vayams tocando para lo que sea, se iran arreglando solos.</p>
<p>Un peque&ntilde;o detalle, ojo con lo de eliminar autom&aacute;ticamente los atributos privados y variable locales no usadas. Yo lo he puesto y seg&uacute;n voy escribiendo c&oacute;digo, tengo la costumbre de salvar con cierta frecuencia. Si escribo una variable local que voy a usar m&aacute;s adelante, pero todav&iacute;a no la he usado y le doy a salvar, me la borra, por lo que tengo que volver a escribirla o darle al Ctrl-Z.</p>
<p>M&aacute;s detalles en <a href="http://www.chuidiang.com/chuwiki/index.php?title=Acciones_autom%C3%A1ticas_al_salvar_un_fichero">Accion adicionales al salvar un fichero con eclipse</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/02/01/acciones-adicionales-al-salvar-un-fichero-con-eclipse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Más de Sonar</title>
		<link>http://blog.chuidiang.com/2009/01/28/mas-de-sonar/</link>
		<comments>http://blog.chuidiang.com/2009/01/28/mas-de-sonar/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 20:03:38 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[métricas]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=471</guid>
		<description><![CDATA[Coment&#233; ayer que acababa de instalar Sonar para la medici&#243;n de m&#233;tricas en nuestros proyectos. Pues bien, hoy he estado intentando hacer una instalaci&#243;n en serio y me he encontrado con varias pegas. Lo he instalado en 3 ordenadores. En dos de ellos me ha dado un error curioso al arrancarlo. Busca en la instalaci&#243;n [...]]]></description>
			<content:encoded><![CDATA[<p>Coment&eacute; ayer que <a href="http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/">acababa de instalar Sonar</a> para la medici&oacute;n de m&eacute;tricas en nuestros proyectos. Pues bien, hoy he estado intentando hacer una instalaci&oacute;n en serio y me he encontrado con varias pegas.</p>
<p>Lo he instalado en 3 ordenadores. En dos de ellos me ha dado un error curioso al arrancarlo. Busca en la instalaci&oacute;n de java un fichero bin/server/jvm.dll. Pues s&oacute;lo en uno de los ordenadores lo hay. En los otros dos, lo que tengo es un bin/client/jvm.dll. As&iacute; que sin ganas de ponerme a investigar sobre la instalaci&oacute;n de java, la soluci&oacute;n r&aacute;pida: copie el directorio client con el nombre de server en el mismo sitio y el mismo contenido. Con eso parece que se le enga&ntilde;a para que arranque.</p>
<p>En la documentaci&oacute;n de Sonar comenta que viene con la base de datos derby db embebida, pero que es recomendable usar una base de datos m&aacute;s seria. Pues nada, <a href="http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:MySQL">vamos con mysql</a>, que lo tengo instalado. Entro en mysql, creo una base de datos para sonar, voy al fichero de configuraci&oacute;n de sonar, quito derby y pongo mysql (esa parte viene muy bien, porque la cadena de conexi&oacute;n de mysql viene comentada y s&oacute;lo hay que descomentarla y cometar la de derby, adem&aacute;s, el driver de mysql en java viene con Sonar, as&iacute; que ni siquiera hay que poner el jar con el conector en ning&uacute;n sitio). M&aacute;s adelante, en el mismo fichero, viene el nombre y usuario para acceso. Y aqu&iacute; viene otra pega m&aacute;s. Hay que configurar el dialecto de la base de datos, pero en la documentaci&oacute;n de Sonar no pone nada de eso. As&iacute; que arranco Sonar, abro el navegador, le doy al bot&oacute;n de crear las tablas, empieza a crear las tablas y acaba fallando. B&uacute;squeda del error en google y en el mismo fichero, m&aacute;s adelante hay que indicarle al <a href="http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Hibernate">hibernate</a> de Sonar el dialecto de la base de datos. Dos propiedades m&aacute;s, una con el dialecto mysql y la otra con la clase que sabe de ese dialecto. Eso s&iacute;, hay que volver a fijarse porque la clase con el dialecto es propia de Sonar, y no la de hibernate (otro ensayo y error y van dos, en ambos casos con borrado previo de la base de datos, que se hab&iacute;a creado a medias).</p>
<p>Listo todo lo referente al servidor. Viene ahora ejecutar el plugin de maven en un proyecto <a href="http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Maven">maven</a> para empezar a meter datos.</p>
<p>Mi primera prueba con la base de datos derby funcion&oacute; a la primera, as&iacute; que sin mirar m&aacute;s, le d&iacute; al comando. Error. No encuentra la base de datos. Me pongo a buscar por google y resulta que el plugin de maven inserta directamente en la base de datos, por lo que necesita todos los par&aacute;metros de conexi&oacute;n. La <a href="http://docs.codehaus.org/display/SONAR/Install+Sonar#InstallSonar-Step5ConfigureMaven2">configuraci&oacute;n necesaria para maven</a> viene en la documentaci&oacute;n de sonar, as&iacute; que culpa m&iacute;a por no haberla le&iacute;do.&nbsp; Pongo todo eso, arranco de nuevo&#8230;. y otro error. Esta vez porque no conoce el dialecto de la base de datos. La documentaci&oacute;n NO pone nada del tema. As&iacute; que me lo invento. En el trozo de xml de configuraci&oacute;n meto dos tags para el dialecto, exactamente con los mismos nombres que el fichero de configuraci&oacute;n del servidor y los mismos valores. Estupendo, ya va.</p>
<p>Me pongo con varios proyectos, poco a poco, y voy consiguiendo los resultados. Pero me salen dos pegas:</p>
<ul>
<li>En algunos proyectos se nos han colado acentos y e&ntilde;es en los nombres de variables y m&eacute;todos. Java lo admite. Sonar no. Salta una excepci&oacute;n y falla todo el proceso. Por m&aacute;s que jugu&eacute; con los encoding, no hubo manera. Al final quit&eacute; los acentos, pero digo yo que lo suyo es que metiera ese fallo en las m&eacute;tricas en vez de saltar la excepci&oacute;n.</li>
<li>En otros proyectos uso una extension <a href="http://maven.apache.org/wagon/wagon-providers/wagon-ftp/">wagon-ftp</a> para el deploy. Pues bien, los wagon son incompatibles con los Sonar. El Sonar entra en una llamada recursiva a s&iacute; mismo y <a href="http://jira.codehaus.org/browse/SONAR-222">da una excepci&oacute;n de StackOverflowError</a>. En fin, habr&aacute; que buscarle arreglo.</li>
</ul>
<p>Ma&ntilde;ana me toca otro rato de pelea, ya que el plugin de maven no se conforma s&oacute;lo con insertar directamente en base de datos, sino que accede al servidor Sonar a trav&eacute;s de http tambi&eacute;n para algo y me est&aacute; fallando esa conexi&oacute;n, supongo que por timeout, o por el proxy corporativo o vete t&uacute; a saber por qu&eacute;.</p>
<p>Hay que reconocer que la herramienta es muy vistosa y que permite ver el estado del proyecto de un vistazo. Pero la instalaci&oacute;n y la documentaci&oacute;n deja bastante que desear, sobre todo teniendo en cuenta que s&oacute;lo son cuatro cosas lo que deber&iacute;an haber puesto, ya que no es una instalaci&oacute;n compleja.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/01/28/mas-de-sonar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Métricas en Java: Sonar</title>
		<link>http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/</link>
		<comments>http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 18:51:12 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[métricas]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=467</guid>
		<description><![CDATA[Esta ma&#241;ana he pasado casi toda la ma&#241;ana en una reuni&#243;n de esas de llorar. Se pretend&#237;a establecer un plan de acci&#243;n para solucionar un problema y al final se ha quedado en un &#34;pobrecitos de nosotros&#8230;&#34;, &#34;cu&#225;ntos problemas tenemos&#8230;&#34;, &#34;qu&#233; malo es el cliente&#8230;&#34;, &#34;qu&#233; pocos somos para hacer el trabajo&#8230;&#34;, &#34;qu&#233; poco tiempo [...]]]></description>
			<content:encoded><![CDATA[<p>Esta ma&ntilde;ana he pasado casi toda la ma&ntilde;ana en una reuni&oacute;n de esas de llorar. Se pretend&iacute;a establecer un plan de acci&oacute;n para solucionar un problema y al final se ha quedado en un &quot;pobrecitos de nosotros&#8230;&quot;, &quot;cu&aacute;ntos problemas tenemos&#8230;&quot;, &quot;qu&eacute; malo es el cliente&#8230;&quot;, &quot;qu&eacute; pocos somos para hacer el trabajo&#8230;&quot;, &quot;qu&eacute; poco tiempo tenemos &#8230;&quot;,&#8230;.</p>
<p>As&iacute; que al terminar la reuni&oacute;n, me fu&iacute; a comer y me pas&eacute; la tarde totalmente desmotivado para el trabajo. Me puse a &quot;internetear&quot; en busca de cosas interesantes y encontr&eacute; <a href="http://sonar.codehaus.org/">Sonar</a>.</p>
<p>Sonar es una herramienta para la medici&oacute;n de m&eacute;tricas del c&oacute;digo java (<a href="http://www.chuidiang.com/chuwiki/index.php?title=Maven_y_PMD">pmd</a>, javancss, findbugs, &#8230; todo junto), pero aporta un par de cosas que me han parecido interesantes.</p>
<p>En primer lugar, al arrancar Sonar, se arranca un servidor web. Las m&eacute;tricas de nuestros proyectos estar&aacute;n accesibles en el navegador v&iacute;a web. Bien, de momento nada del otro mundo.</p>
<p>La parte interesante es que las m&eacute;tricas se generan con un plugin de <a href="http://www.chuidiang.com/java/herramientas/maven.php">maven</a> y ese plugin busca al servidor web para a&ntilde;adirle el proyecto (si es la primera vez que lo compilamos con el plugin) o para actualizarle las m&eacute;tricas. Esto no deja de ser una peque&ntilde;a maravilla, puesto que se puede ejecutar el plugin en nuestros compilados nocturnos, de forma que siempre tendremos en el servidor web de Sonar las m&eacute;tricas actualizadas al d&iacute;a. Es m&aacute;s, Sonar guarda las estad&iacute;sticas de c&oacute;mo evolucionan las m&eacute;tricas, as&iacute; que con el tiempo tendremos un gr&aacute;fico que indica si cada vez hay m&aacute;s o menos violaciones de m&eacute;tricas en el proyecto.</p>
<p>La segunda cosa que me ha resultado interesante es la forma de presentar los resultados. Aparte de las obligadas tablas con valores, se presentan con bloques de colores por proyectos, paquetes y clases. Me explico, hay una vista en la que salen los proyectos como bloques de colores, cada bloque del tama&ntilde;o proporcional al tama&ntilde;o del proyecto. El color es rojo si el proyecto tiene muchas violaciones de m&eacute;tricas y va tirando a verde seg&uacute;n est&eacute; mejor. Pinchando el cuadro de un proyecto, se cambia la vista a los paquetes en ese proyecto, nuevamente con rect&aacute;ngulos de distintos tama&ntilde;os y colores. Pinchando en uno de esos paquetes, aparecen las clases con el mismo tipo de presentaci&oacute;n visual.</p>
<p>Esta forma de presentaci&oacute;n es realmente interesante si se pretenden arreglar las m&eacute;tricas de un proyecto que est&eacute; mal. Con ella se puede navegar r&aacute;pidamente e identificar los proyectos, paquetes y clases m&aacute;s conflictivos, centr&aacute;ndose primero en ellos.</p>
<p>Y ya puestos, tambi&eacute;n tiene una nube de tags en el que cada tag es una de las clases del proyecto. Los tags m&aacute;s gordos son las clases m&aacute;s horribles &quot;m&eacute;tricamente&quot; hablando. As&iacute; que incluso es mucho m&aacute;s sencillo identificar de un s&oacute;lo vistazo cual es la primera clase que deber&iacute;amos arreglar de todos los proyectos que tenemos. Por supuesto, te presenta el c&oacute;digo fuente de la clase indicando en qu&eacute; puntos hay violaciones de m&eacute;tricas y cuales.</p>
<p>En este enlace tienes explicadas las <a href="http://docs.codehaus.org/display/SONAR/Sonar+in+a+nutshell">distintas pantallas de Sonar</a> y puedes ver los cuadraditos y nubes de tags que menciono. </p>
<p>Actualmente metemos el plugin pmd en maven de forma que si fallan las m&eacute;tricas, falla el compilado. Es la forma de garantizar que la gente codifica siguiendo las m&eacute;tricas desde el principio. Sin embargo, tenemos mucho c&oacute;digo con m&eacute;tricas horribles, ya que nunca nos hab&iacute;amos preocupado en serio de ello. Sonar me va a permitir identificar los peores trozos de c&oacute;digo e ir arregl&aacute;ndolos poco a poco. </p>
<p>En fin, Sonar es una herramienta que intentar&eacute; ver c&oacute;mo integro en los proyectos con Hudson (creo que <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Sonar+plugin">hay plugin de Sonar para Hudson</a>), que me dar&aacute; entreteniento unos d&iacute;as y si quieren que trabaje en algo serio, que no me metan en reuniones desmoralizantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/01/27/metricas-en-java-sonar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

