<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7691761364586353671</id><updated>2012-02-16T18:21:58.725-08:00</updated><category term='equipo'/><category term='compartir es vivir'/><category term='calidad'/><category term='trabajo'/><title type='text'>los caballeros que dicen NI!</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-4508570677592846129</id><published>2011-09-15T08:05:00.000-07:00</published><updated>2011-09-15T08:06:26.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='equipo'/><title type='text'>Saliendo de la crisálida</title><content type='html'>&lt;p&gt;Cuando trabajamos en un equipo ágil, ¿A que nos referimos exactamente con mejora continua?&lt;/p&gt; &lt;p&gt;¿La capacidad de dar cada vez mejores soluciones tecnológicas? Todos sabemos que los desarrolladores muchas veces pecamos de querer “rizar el rizo”. Se nos puede ir de las manos, y la satisfacción y el ego personal nos llevan a hacer cosas sólo porque se pueden hacer.&lt;/p&gt; &lt;p&gt;¿El aumento de la velocidad? Un aumento indiscriminado de la velocidad nos puede llevar a un descenso de la calidad si no lo tratamos adecuadamente, y todo el mundo sabe que esto es “pan para hoy y hambre para mañana”. Los bugs de ayer nos restan velocidad en el sprint de mañana.&lt;/p&gt; &lt;p&gt;¿Aumento de la calidad? Cierto es que aumentando la calidad de nuestro código, de nuestras entregas... vamos a ser un equipo mucho más rápido. Pero tampoco hay que obsesionarse en exceso montando sistemas automáticos exagerados, para no perder de vista el compromiso del sprint.&lt;/p&gt; &lt;p&gt;Lo que yo entiendo por mejora continua es: mejorar el funcionamiento como equipo. No podemos tener al especialista y único conocedor de partes importantes de la aplicación porque nos lleva a dependencia excesiva de un individuo en concreto. No podemos saltarnos los criterios de calidad del equipo, porque las buenas intenciones se suelen quedar en eso, buenas intenciones. Tenemos que encontrar una “norma” de trabajo con la que todo el equipo esté cómodo y que nos salga de manera natural, no podemos depender de tareas que pueden caer en el olvido.&lt;/p&gt; &lt;p&gt;Poco a poco, retrospectiva a retrospectiva, debemos tender a crear un entorno de trabajo en el que nos sintamos cómodos porque: ¡un equipo feliz es un equipo que funciona!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-4508570677592846129?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/4508570677592846129/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=4508570677592846129' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/4508570677592846129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/4508570677592846129'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2011/09/saliendo-de-la-crisalida.html' title='Saliendo de la crisálida'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-1506026551910707860</id><published>2011-09-13T10:07:00.001-07:00</published><updated>2011-09-13T10:07:55.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calidad'/><title type='text'>Quien apoya tu teoría</title><content type='html'>&lt;p&gt;Cuando estamos desarrollando una aplicación informática queremos saber que nuestro código es bueno, que funciona como queremos, que no vamos a encontrarnos nada inesperado. Para ello existen las pruebas automáticas (test unitarios, de integración).  &lt;/p&gt; &lt;p&gt;Ahora bien cómo podemos demostrar que algo que tanto nos gusta nos como es hacer pruebas automáticas de nuestro software da el resultado esperado. Evidentemente demostrando que no tenemos errores. Esto suena obvio a la par que arbitrario.&lt;/p&gt; &lt;p&gt;Una forma de apoyar el hecho (que no teoría) de que realizar pruebas automáticas sobre nuestro software nos va a dar los resultados de los que tanto se habla (y muchos somos unos convencidos, y la mayoría unos escépticos) es la cobertura.&lt;/p&gt; &lt;p style="margin-bottom: 0cm"&gt;La cobertura es una medida que nos indica el grado de código de una aplicación que está “testeado”. Con una herramienta adecuada podemos obtener estadísticas tales como: que cantidad de líneas de código hay testeadas en una clase o paquete, cual es la cobertura de las condicionales (if, switch, for, try-catch...) de nuestro código... De esta manera conocemos un dato mas sobre lo buenas o malas que son nuestras pruebas automáticas de código.&lt;/p&gt; &lt;p style="margin-bottom: 0cm"&gt;En mi opinión (experiencia personal) el hecho de realizar muchos test “sin ton ni son” por sí sólo no te evita el cometer errores ni te garantiza que pruebes lo que realmente quieres probar. Sin embargo el hacer unos BUENOS test en combinación con mantener siempre una alta cobertura de código te va a proporcionar todas las ventajas de las que tanto se ha oído hablar en el mundo del testeo de software.&lt;/p&gt; &lt;p style="margin-bottom: 0cm"&gt;Lo sugerido para una nueva aplicación es mantener siempre una alta cobertura poniendo un mínimo obligatorio (70%, 80%, 90%...) al gusto del consumidor, del que no se pueda bajar. Como siempre consensuado por el equipo que va a desarrollar la aplicación y va a hacerla perfec... con el mínimo de bugs posible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-1506026551910707860?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/1506026551910707860/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=1506026551910707860' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/1506026551910707860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/1506026551910707860'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2011/09/quien-apoya-tu-teoria.html' title='Quien apoya tu teoría'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-67032577418781641</id><published>2010-03-19T07:06:00.000-07:00</published><updated>2010-03-19T10:02:15.221-07:00</updated><title type='text'>Realizando un problema con TDD</title><content type='html'>Desarrollo guiado por pruebas, o Test-driven development (TDD)  es una práctica de programación que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y Refactorización (Refactoring). ( &lt;a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas"&gt;wikipedia&lt;/a&gt; ) para el que no sepa de que va.&lt;br /&gt;Voy a tratar de explicar de forma sencilla los conocimientos que he adquirido sobre esta técnica, sobre todo en la última semana motivado por un curso. Este curso lo impartió &lt;a href="http://www.carlosble.com/"&gt;Carlos Ble&lt;/a&gt;, que además es el autor de un libro muy interesante sobre el desarrollo utilizando TDD, el único en castellano. Para todo el que quiera saber más es preferible que consulte los trabajos de Carlos que sabe mucho mas que yo al respecto.&lt;br /&gt;&lt;br /&gt;Bueno dada una pequeña introducción sobre que es TDD voy a prensentar el ejemplo que se me ha ocurrido desarrollar. Posiblemente no sea el mejor ejemplo, pero me ha parecido muy didáctico para un primer contacto con TDD.&lt;br /&gt;&lt;br /&gt;Tenemos una clase coordenada (Coordinate.java) a la que le vamos a incluir un método compareTo. Éste método funcionará de manera similar al de la clase String. Pero para ello, antes de empezar a implementar la funcionalidad vamos a implementar un test con jUnit (CoordinateComparationTest.java), y creamos un método de test nuevo (testCompareCoordinatesSame). El método tratará de comparar dos coordenadas que son iguales.&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testCompareCoordinatesSame() throws Exception {&lt;br /&gt;//Data&lt;br /&gt;Coordinates coord1 = new Coordinates(0.00, 0.00);&lt;br /&gt;Coordinates coord2 = new Coordinates(0.00, 0.00);&lt;br /&gt;//Execution&lt;br /&gt;int greater = coord1.compareTo(coord2);&lt;br /&gt;//Assertions&lt;br /&gt;assertEquals(0, greater); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como podemos ver el test tiene tres partes diferenciadas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creación de los datos de prueba.&lt;/li&gt;&lt;li&gt;Ejecución del método a testear.&lt;/li&gt;&lt;li&gt;Comprobación del o los resultados.&lt;/li&gt;&lt;/ul&gt;Después de implementar el método de test nos encontramos con que el metodo compareTo nos sale en “rojo”, es decir, el método no existe. Pues bien procedemos a crear un método compareTo en la clase  Coordinate.java con el código mínimo necesario para que exista el método. (Nos referimos con código mínimo al código necesario para dar solución a una cuestión, en este caso evitar el error: no existe método...).&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Compares two Coordinates&lt;br /&gt;*&lt;br /&gt;* @param coord2&lt;br /&gt;*            the other coordinate&lt;br /&gt;* @return result == 0 if both are equal; result &gt; 0 if first is higher; in&lt;br /&gt;*         other case result &lt; 0&lt;br /&gt;*/&lt;br /&gt;public int compareTo(Coordinates coord2) {&lt;br /&gt;return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ahora que ya tenemos el método creado procedemos a lanzar los test. Comprobamos que ha fallado, puesto que esperábamos un 0 (ambos iguales) y nos devuelve un -1. Ahora si, procedemos a implementar la funcionalidad que nos devuelva un 0 al comparar dos coordenadas iguales.&lt;br /&gt;&lt;br /&gt;public int compareTo(Coordinates coord2) {&lt;br /&gt;int res = -1;&lt;br /&gt;if (this.equals(coord2)) {&lt;br /&gt; res = 0;&lt;br /&gt;}&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Al volver al lanzar el test debería pasarlo sin problemas. Para esto nos hemos valido del método equals de la clase (para ello debe estar implementado).&lt;br /&gt;&lt;br /&gt;Pues bien, seguimos con el siguiente caso, que pasa cuando tenemos dos coordenadas cuyas latitudes sean diferentes. Pues creamos un nuevo método que pruebe dos coordenadas cuyas latitudes sean diferentes.&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void tesCompareCoordinatesFirstHigherLatitude() throws Exception {&lt;br /&gt;//Data&lt;br /&gt;Coordinates coord1 = new Coordinates(1.00, 0.00);&lt;br /&gt;Coordinates coord2 = new Coordinates(0.00, 0.00);&lt;br /&gt;//Execution&lt;br /&gt;int greater = coord1.compareTo(coord2);&lt;br /&gt;//Assertions&lt;br /&gt;assertTrue(greater &amp;gt;  0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ahora lanzamos el test y comprobamos que ha fallado nuevamente. Procedemos igual que antes, vamos a implementar este caso, la primera latitud es mayor que la segunda.&lt;br /&gt;&lt;br /&gt;public int compareTo(Coordinates coord2) {&lt;br /&gt;int res = -1;&lt;br /&gt;if (this.equals(coord2)) {&lt;br /&gt; res = 0;&lt;br /&gt;} else if (this.getLatitude() &amp;gt;  coord2.getLatitude()) {&lt;br /&gt; res = 1;&lt;br /&gt;}&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Ahora procedemos de la misma manera, lanzar el test y recoger los frutos.&lt;br /&gt;&lt;br /&gt;El siguiente caso sería comprobar que pasa cuando dos coordenadas tienen la misma latitud y distinta longitud.&lt;br /&gt;&lt;br /&gt;public void tesCompareCoordinatesSameLatitudeFirstHigherLongitude()&lt;br /&gt;throws Exception&lt;br /&gt;{&lt;br /&gt;//Data&lt;br /&gt;Coordinates coord1 = new Coordinates(0.00, 1.00);&lt;br /&gt;Coordinates coord2 = new Coordinates(0.00, 0.00);&lt;br /&gt;//Execution&lt;br /&gt;int greater = coord1.compareTo(coord2);&lt;br /&gt;//Assertions&lt;br /&gt;assertTrue(greater &amp;gt;  0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Nuevamente el procedimiento es el mismo, lanzar el test, comprobar el resultado y en caso de ser negativo volver a implementar la funcionalidad necesaria.&lt;br /&gt;&lt;br /&gt;public int compareTo(Coordinates coord2) {&lt;br /&gt;int res = -1;&lt;br /&gt;if (this.equals(coord2)) {&lt;br /&gt; res = 0;&lt;br /&gt;} else if (this.getLatitude() &amp;gt;  coord2.getLatitude()) {&lt;br /&gt; res = 1;&lt;br /&gt;} else if (this.getLatitude() == coord2.getLatitude() &amp;amp;&amp;amp;&lt;br /&gt;         this.getLongitude() &amp;gt;  coord2.getLongitude())&lt;br /&gt;{&lt;br /&gt; res = 1;&lt;br /&gt;}&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Una vez lanzados los test (es importante lanzar todos cada vez para ver que no hemos perdido funcionalidad ya implementada) y comprobar que han pasado correctamente, iríamos a comprobar mas casos: la segunda latitud mayor que la primera, ambas longitudes iguales y la segunda longitud mayor... Y si los test no pasan implementar la nueva funcionalidad.&lt;br /&gt;En este caso parece que toda la funcionalidad posible ya se ha implementado (hay que asegurarse con los casos de test propuestos). Con lo cual la funcionalidad estaría terminada y cubierta ante posibles bugs, y hemos asegurado (o al menos intentado) que el problema se ha resuelto con el mínimo código posible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-67032577418781641?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/67032577418781641/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=67032577418781641' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/67032577418781641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/67032577418781641'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2010/03/realizando-un-problema-con-tdd.html' title='Realizando un problema con TDD'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-2601022543086746173</id><published>2010-03-18T01:22:00.000-07:00</published><updated>2010-03-18T01:57:50.466-07:00</updated><title type='text'>Mejorando un poco el rendimiento</title><content type='html'>Muchas veces, cuando estamos escribiendo código seguimos una serie de prácticas que en ocasiones pueden perjudicar al tiempo de ejecución de la aplicación.&lt;br /&gt;Un ejemplo muy claro puede ser en la ejecución de un bucle:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;for(int i = 0;  i &lt;/span&gt;&amp;#60;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt; oneList.size(); i++){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;   ***&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;br /&gt;&lt;br /&gt;Cada vez que pasamos por el bucle consultamos el método size que es mas lento que por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;int size = oneList.size();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;for(int i = 0;  i &lt;/span&gt;&lt;/span&gt;&amp;#60;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt; size; i++){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt;    ***&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;font-family:trebuchet ms;" &gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;br /&gt;&lt;br /&gt;La mejora de rendimiento si que es cierto que es mínima, pero todo depende de lo grande que sea la lista en este caso, si hay bucles anidados...&lt;br /&gt;El primer fallo que podemos ver en esta solución es: ¿Qué pasa si alguien modifica la variable size? pues muy simple, "la hemos liado". Sin embargo la solución a esta cuestión es evidente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-weight: bold;"&gt;final&lt;/span&gt; int size = oneList.size();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nos aseguramos que nadie pueda modificar la variable.&lt;br /&gt;&lt;br /&gt;Podemos utilizar esta "mejora" en otro caso similar a este:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;for(int i = 0;  i &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;#60;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt; oneObject.getList.size(); i++)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;&lt;br /&gt;En este caso podemos observar que el número de accesos es mucho mayor, y puede aumentar considerablemente, por lo que la mejora de rendimiento al refactorizar, ahora si, se podría tener mas en cuenta.&lt;br /&gt;&lt;br /&gt;Podemos aplicarlo no sólo a bucles si no a llamadas que veamos repetidas a lo largo de todo el método:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;if(oneObject.getOneProperty().getValue() != null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;   print(oneObject.getOneProperty().getValue());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simplemente extraemos ese value a una variable.&lt;br /&gt;&lt;br /&gt;Si desarrollamos con algunos IDEs muchas veces nos ofrece funcionalidades que nos permiten refactorizar el código una vez editado. Por ejemplo, en Eclipse, al seleccionar la porción de código y pulsar la combinación de teclas alt + shift + L nos extraería una variable a partir de una expresión, y la sustituye cada vez que se la ha llamado, por el nombre de la variable. Funciona fráncamente bien pero aconsejaría revisar lo que hace antes de darlo por válido...&lt;br /&gt;&lt;br /&gt;Se puede hacer algo similar con los Strings en java. Cuantas veces nos hemos encontrado algo similar a esto:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;String a = 1 + " " + " " + 2 + " " 3 ***&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cada vez que nos encontramos con un &lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;" "&lt;/span&gt; o &lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;"lo que sea"&lt;/span&gt; estamos creando un nuevo String (en otra entrada hablaremos sobre la suma de Strings y cómo mejorarlo utilizando StringBuffer) con la consecuente pérdida de rendimiento. Podemos símplemente extraer una constante para la clase que contenga ese valor y llamarla siempre que estemos tentados de crear una nueva, así sólo la creamos una vez. También es posible utilizar una clase que contanga constantes comunes para toda la aplicación. Sería algo similar a esto:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;private static final String ESPACIO = " ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;***&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;String a = 1 + ESPACIO + ESPACIO + 2 + ESPACIO 3 ***&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:trebuchet ms;" &gt;***&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hablando con personas mas y menos experimentadas en esto de la programación hemos tenido cierto debate, entre que la mejora puede ser mínima y que el código puede ser mas complicado de entender. Yo soy partidario de utilizar ésta técnica pero tampoco afirmo que sea lo mejor, eso lo dejo en manos de que cada persona o grupo de trabajo encuentre la técnica que mejor le venga.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-2601022543086746173?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/2601022543086746173/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=2601022543086746173' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/2601022543086746173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/2601022543086746173'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2010/03/mejorando-un-poco-el-rendimiento.html' title='Mejorando un poco el rendimiento'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-4412875779421366456</id><published>2008-04-09T13:15:00.000-07:00</published><updated>2010-03-18T05:05:09.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trabajo'/><title type='text'>Múltiples monitores</title><content type='html'>Cuando trabajamos con ordenadores solemos tener muchas ventanas abiertas y superpuestas. Si estamos trabajando en una necesitamos ver el contenido de otra y nuestro monitor termina por quedarse pequeño. Muchas ventanas nos sirven para obtener información lo que ocurre en otra y con un monitor e incluso con un monitor mayor no podemos ver todo con un golpe de vista.&lt;br /&gt;&lt;br /&gt;Una solución adecuada es la de añadir un nuevo monitor a nuestra mesa de trabajo. Hoy en día la mayoría de tarjetas gráficas soportan trabajar con 2 (en ocasiones mas) monitores sin necesidad de utilizar 2 ordenadores.&lt;br /&gt;&lt;br /&gt;Algunos de los posibles usos:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;Un diseñador de páginas web puede escribir el código que genera sus páginas en un monitor y en un segundo monitor visualizar en "tiempo real" el resultado de su trabajo. Además cada monitor puede tener una resolución de pantalla diferente.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;Un programador puede escribir código en un monitor y ver la salida de datos en en segundo.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;Y para los aficionados a la fotografía, las aplicaciones de retoque fotogáfico suelen tener muchas paletas y barras de herramientas que podemos mover al segundo monitor y tenerlas visibles en todo momento.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Y dejando volar la imaginación podemos encontrarle muchas mas utilidades, sino siempre podemos hacer algo asi:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2TMmN8RsD3A/R_0nX2Rm0JI/AAAAAAAAAAQ/x3mG_igr-24/s1600-h/Small3Monitors.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_2TMmN8RsD3A/R_0nX2Rm0JI/AAAAAAAAAAQ/x3mG_igr-24/s320/Small3Monitors.JPG" alt="" id="BLOGGER_PHOTO_ID_5187345636460515474" border="0" /&gt;&lt;/a&gt;Y algunos (sobre todo tus jefes) dirán: ¿Y todo esto para qué? pues &lt;strike&gt;para continuar con el rigor científico que caracteriza a este artículo&lt;/strike&gt; hay un estudio que circula por la red que demuestra que la productividad puede aumentar entre un 20% y un 30%.&lt;br /&gt;&lt;strike&gt;Nosotros lo podemos justificar como queramos ante los jefes, padres o parejas sentimentales, pero no nos engañemos, la finalidad de todo esto es chulear y jugar al Doom.&lt;/strike&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-4412875779421366456?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/4412875779421366456/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=4412875779421366456' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/4412875779421366456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/4412875779421366456'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2008/04/multipes-monitores.html' title='Múltiples monitores'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2TMmN8RsD3A/R_0nX2Rm0JI/AAAAAAAAAAQ/x3mG_igr-24/s72-c/Small3Monitors.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7691761364586353671.post-3862575618529797831</id><published>2008-04-09T03:33:00.000-07:00</published><updated>2008-04-09T03:49:43.209-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compartir es vivir'/><title type='text'>Compartición de ficheros fácil y rápido</title><content type='html'>&lt;span style="font-weight: bold;"&gt;         PipeBytes&lt;/span&gt; es un servicio web muy fácil de utilizar que nos permite intercambiar archivos con un amigo (bueno no hace falta que sea amigo). Creo que se basa en algún protocolo p2p (de esos que por lo visto son clandestinos y sólo utiliza la gente de mal vivir).&lt;br/&gt;&lt;br /&gt;Las ventajas respecto a otro sistema es que sólo necesitas un navegador web (recomendado firefox, opera, konqueror...).&lt;br/&gt;&lt;br /&gt;El funcionamiento es sencillo: Si quieres compartir un fichero previamente lo tendremos que subir desde nuestro equipo y pasar el enlace al interesado. Una vez aceptado el interesado la transfererencia, cuando ésta finaliza por el motivo que sea el fichero se borra del servidor, para volver a compartirlo habrá que subirlo nuevamente.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;La url es la siguiente:&lt;br /&gt;&lt;a href="http://host01.pipebytes.com/"&gt;http://host01.pipebytes.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para mas información visitad la página.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7691761364586353671-3862575618529797831?l=derlinisland.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://derlinisland.blogspot.com/feeds/3862575618529797831/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7691761364586353671&amp;postID=3862575618529797831' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/3862575618529797831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7691761364586353671/posts/default/3862575618529797831'/><link rel='alternate' type='text/html' href='http://derlinisland.blogspot.com/2008/04/comparticin-de-ficheros-fcilmente.html' title='Compartición de ficheros fácil y rápido'/><author><name>Iñaki</name><uri>http://www.blogger.com/profile/10938431484500177647</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
