<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
 <channel>
  <title>Refactoring</title>
  <link>http://www.programacion.com/blogs/14_refactoring</link>
  <description>&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;font color=&quot;#cccccc&quot;&gt;&quot;Es facil tener una idea complicada, pero es realmente complicado tener una idea simple.&quot; Carver Mead &lt;/font&gt; &lt;br&gt;
&lt;font color=&quot;#cccccc&quot;&gt;&quot;La simplicidad es la máxima sofisticación&quot; Leonardo da Vinci&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#cccccc&quot;&gt;&quot;Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius, and a lot of courage, to move in the opposite direction.&quot; Albert Einstein &lt;/font&gt; &lt;br&gt;&lt;br&gt;
&lt;tr&gt;&lt;td&gt;
&lt;center&gt;
&lt;a href=&quot;http://www.skymedia-group.com&quot;&gt;
&lt;img src=&quot;http://www.programacion.com/blogs/14_refactoring/get/smg_banner1_4.gif&quot; /&gt;
&lt;a href=&quot;http://www.especulacion.org&quot;&gt;
&lt;img src=&quot;http://www.especulacion.org/foros/templates/subSilver/images/logo.gif&quot; /&gt;

&lt;/a&gt;
&lt;/center&gt;
&lt;td&gt;
&lt;center&gt;
&lt;a href=&quot;http://www.agile-spain.com&quot;&gt; &lt;img alt=&quot;Agile-Spain&quot; src=&quot;http://www.agile-spain.com/agilev2/files/logo.png&quot; /&gt;&lt;/a&gt; 
&lt;a href=&quot;http://www.planetacodigo.com&quot;&gt;&lt;img src=&quot;http://www.planetacodigo.com/imagenes/planetacodigo.png&quot; alt=&quot;planetacodigo&quot; title=&quot;PlanetaCodigo: weblogs sobre programación en castellano&quot; border=&quot;0&quot; width=&quot;80&quot; height=&quot;15&quot;/&gt;&lt;/a&gt; 
&lt;/center&gt;
&lt;/table&gt;</description>
  <generator>pLog 0.3</generator>
    <item>
   <title>Aplicando la programación a finanzas</title>
   <description>&lt;p&gt;La oportunidad que nos ofrece el ser programadores en otros ambitos, es el ser capaces de utilizar la poderosa herramienta que es la programación. En finanzas y en concreto en bolsa existe una tendencia cada vez mas importante de informatizar las tomas de decisiones sobre comprar o vender acciones. Os invito a visitar el nuevo blog que he creado sobre Bolsa, &lt;a href=&quot;http://www.especulacion.org&quot;&gt;http://www.especulacion.org&lt;/a&gt; en el que trato de explicar los desarrollos que estoy realizando para encontrar sistemas automáticos que inviertan en bolsa. Si alguno tiene esta misma afición y quiere compartir este aprendizaje podemos ponernos el contacto en los foros del portal.&lt;/p&gt;&lt;br/&gt;&lt;p /&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/834_aplicando_la_programacin_a_finanzas.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/834_aplicando_la_programacin_a_finanzas.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/834_aplicando_la_programacin_a_finanzas.html</guid>
      <author>Kohonen</author>
      <category>General</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Libros imprescindibles para un programador</title>
   <description>&lt;p&gt; En este profesión es imprescindible seguir formandose continuamente. La lectura de diferentes web o de articulos son una muy buena forma de poder hacerlo, aunque el problema que en mi opinión tienen es que su formato no permite que se entre en demasiado detalle. Para cubrir este problema podemos encontrar libros realmente buenos que en mi opinión son de imprescindible lectura para un buen programador. Si encima como si eres de esas raras personas a las que les gusta leer libros técnicos en tu tiempo libre, entonces probablemente te puedan dar algunas ideas la lista de libros que te propongo.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;En principio este post voy a tratar de irlo actualizando con la lista de libros que voy leyendo y con vuestra sugerencias. Es una lista reducida de los mejores libros que he leido. &lt;/p&gt;&lt;p /&gt;&lt;p&gt;Una de las preguntas que recomiendo hacer en un entrevista cuando se contrata a un programador, es ¿Cual es último libro que has leido sobre temas técnicos?. En mi opinión es muy acertada porque permite saber el interes que tiene una persona en seguir actualizado. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Os recomiendo que sigais los enlaces de las imagenes si quereis comprar alguno, porque en Amazon estan a muy buen precio. &lt;/strong&gt;&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;strong&gt;Refactoring: Improving the Design of Existing Code&lt;/strong&gt; : Martin Fowler En mi opinion la biblia de la Refactorización. Deberían estudiarse estas refactorizaciones en la facultad. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/redirect?link_code=as2&amp;amp;path=ASIN/0201485672&amp;amp;tag=especulaciono-20&amp;amp;camp=1789&amp;amp;creative=9325&quot;&gt;&lt;img src=&quot;http://images.amazon.com/images/P/0201485672.01._AA_SCMZZZZZZZ_.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;img height=&quot;1&quot; alt=&quot;&quot; src=&quot;http://www.assoc-amazon.com/e/ir?t=especulaciono-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201485672&quot; width=&quot;1&quot; border=&quot;0&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pragmatic Programmer&lt;/strong&gt;: Mi favorito. Un excelente y completo compendio de las buenas prácticas que debe seguir un programador. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/redirect?link_code=as2&amp;amp;path=ASIN/020161622X&amp;amp;tag=especulaciono-20&amp;amp;camp=1789&amp;amp;creative=9325&quot;&gt;&lt;img src=&quot;http://images.amazon.com/images/P/020161622X.01._AA_SCTZZZZZZZ_.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;img height=&quot;1&quot; alt=&quot;&quot; src=&quot;http://www.assoc-amazon.com/e/ir?t=especulaciono-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=020161622X&quot; width=&quot;1&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;strong&gt;Desarrollo Dirigido por Pruebas&lt;/strong&gt;: Despues de este libro hay un antes y un despues en la forma de programar. Muy interesante la lectura del primer apartado, que con un ejemplo sencillo conseguira introducirnos en el mundo del desarrollo dirigido por pruebas. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/redirect?link_code=as2&amp;amp;path=ASIN/0321146530&amp;amp;tag=especulaciono-20&amp;amp;camp=1789&amp;amp;creative=9325&quot;&gt;&lt;img src=&quot;http://images.amazon.com/images/P/0321146530.01._AA_SCMZZZZZZZ_.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;img height=&quot;1&quot; alt=&quot;&quot; src=&quot;http://www.assoc-amazon.com/e/ir?t=especulaciono-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321146530&quot; width=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pensando en Java&lt;/strong&gt;: Un libro excepcional para repasar Orientación a Objetos para los amantes de Java. Por cierto este se puede descargar gratis desde la web, aunque yo creo que merece la pena tener el libro. &lt;br /&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/redirect?link_code=as2&amp;amp;path=ASIN/0131002872&amp;amp;tag=especulaciono-20&amp;amp;camp=1789&amp;amp;creative=9325&quot;&gt;&lt;img src=&quot;http://images.amazon.com/images/P/0131002872.01._AA_SCMZZZZZZZ_.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;img style=&quot;&quot; height=&quot;1&quot; alt=&quot;&quot; src=&quot;http://www.assoc-amazon.com/e/ir?t=especulaciono-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0131002872&quot; width=&quot;1&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/810_libros_imprescindibles_para_un_programador.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/810_libros_imprescindibles_para_un_programador.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/810_libros_imprescindibles_para_un_programador.html</guid>
      <author>Kohonen</author>
      <category>General</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Eliminar Variable Temporal (Inline Temp)</title>
   <description>&lt;p&gt;¿Tendemos a hacer optimización temprana? La verdad es que, no se si heredado de otras epocas donde el espacio era muy valioso, o porque realmente tenemos tendencia a preocuparnos mucho por la eficiencia, pero creo que se suele generalmente hacer optimización temprana. Pero, ¿no es mas facil atacar el problema de la eficiencia una vez que hemos desarrollado nuestra aplicación consiguiendo un buen diseño orientado a objetos? ¿No es una mala práctica guiar nuestro diseño y nuestra codificación en función de optimizaciones cuyo impacto todavía desconocemos?&lt;/p&gt;&lt;br/&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;br /&gt;* Situación inicial:En un método se asigna un valor a una variable temporal y se usa esta a lo largo del método.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Refactorización: Sustituir la variable temporal por las llamadas al metodo.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Situación final: La variable temporal ha sido eliminada. Esta ha sido sustituida por invocaciones. &lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt;   &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { &lt;/p&gt;&lt;pre&gt;    double interes = prestamo.calculaInteres();&lt;br /&gt;    if (interes &amp;gt; o) ...&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;... &lt;/pre&gt;&lt;pre&gt;} &lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Después de aplicar &lt;em&gt;Eliminar Variable Temporal&lt;/em&gt; tendremos el siguiente código: &lt;/p&gt;&lt;br /&gt;&lt;p&gt;public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { &lt;/p&gt;&lt;pre&gt;    if (prestamo.calculaInteres() &amp;gt; o) ...&lt;br /&gt;...&lt;/pre&gt;&lt;p&gt;}  &lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Url&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class=&quot;blogbody&quot;&gt;  &lt;a href=&quot;http://www.refactoring.com/catalog/inlineTemp.html&quot;&gt;http://www.refactoring.com/catalog/inlineTemp.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Comentarios&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;blogbody&quot;&gt;   Con esta refactorización me costo estar de acuerdo. Quizas el ejemplo que pongo no refleja bien el problema que le veia. El problema que le veia a esta Refactorizacion era que estabamos eliminando la variable que almacenaba el resultado de una llamada a otro metodo y que por este motivo tendriamos que hacer esa misma llamada en cualquiera de los sitios donde estuvieramos utilizando esa variable. ! Que perdida de eficiencia !&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;blogbody&quot;&gt;   De lo que no era consciente es que cuando programamos muchas veces no nos importa aplicar soluciones que harán nuestro código inmantenible con la excusa de ganar eficiencia. Parece que esta excusa es una de las mejores que nos podemos poner para saltarnos las reglas de una buena codificación. La experiencia me dice que mucho mas fácil  y mas productivo mejorar la eficiencia de un código bien desarrollado, que ir según vamos desarrollando aplicando mejoras de performance que no sabemos cual el impacto que tendrán en el global. Desde luego por ese motivo no considero una buena razon la perdida de eficiencia para no entender esta refactorizacion.&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;blogbody&quot;&gt;   Una vez soltado el discurso filosófico, creo las variable temporales en muchos casos hacen nuestro código mas ilegible. Bien por la nomenclatura, bien por que las utilizamos para varias cosas. Son especialmente dolorosos los efectos colaterales que a veces ocasionan. En aquellos casos en los que el valor que tenemos en la variable temporal se obtenga de una llamada sencilla es muy recomendable hacer esta refactorización.&lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/807_eliminar_variable_temporal_inline_temp.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/807_eliminar_variable_temporal_inline_temp.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/807_eliminar_variable_temporal_inline_temp.html</guid>
      <author>Kohonen</author>
      <category>Refactorizaciones de Código</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Principio de Segregacion de las Interfaces (Interface Segregation Principle ISP)</title>
   <description>&lt;p&gt;Uno de las partes mas importantes de un sistema es el conjunto de interfaces que definimos para exponer su funcionalidad. Nosotros mismo cuando trabajamos con otras librerias nos enfrentamos a diferentes interfaces diseñadas con mas o menos exito. Este diseño puede hacer que sea muy costoso o complicado utilizar ciertas librerias que no han sido correctamente diseñada.  Uno de los principios de diseño de clases que aborda este problema es el Principio de Segregación de Interfaces&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Me encontrado con varias frases que definen este principio. La que mas me gusta es la siguiente&lt;/p&gt;&lt;p&gt;   &lt;em&gt;Los clientes no deberían ser obligados a depender de interfaces que no utilizan&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Tambien he encontrado otra frase que resume la misma idea&lt;/p&gt;&lt;p&gt;   &lt;em&gt;Muchas interfaces muy especializadas son preferibles a una interfaz general en la que se agrupen todas las interfaces  &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Lo que nos dice este principio es que es preferible crear muchas interfaces a tener una única interfaz. ¿Porque es mejor? Porque estamos haciendo un mejor diseño orientado a objetos. Crear una única interfaz supone dar mucha responsabilidad a una clase que debiera separarse por la relación que existe en sus funcionalidad. Uno de los sintomas mas comunes que nos encontraremos cuando estemos cometiendo este error será que no encontraremos facilmente un nombre para dicha clase. Tanta responsabilidad es dificil poder resumirla en una palabra, y al fina utilizaremos nombres por ejemplo Manager que encajará muy bien de comodin.&lt;/p&gt;&lt;p&gt;Deberiamos evitar que nuestro código tenga demasiado acoplamiento que haga que cada modificación implique cambios en multitud de clases.&lt;/p&gt;&lt;p&gt; No obstante, siendo sincero, cuando yo he desarrollado he tendido a realizar interfaces nada especializadas. El problema que trataba de solucionar cuando creaba estas interfaces era el de abstraer al cliente de mi interfaz de las implementación de mis interfaces. La clase general trataba de ser la única dependencia que se generaría de cara a mis clientes extener, teniendo de alguna forma &amp;quot;controlado&amp;quot; que cambios en mi implementación no afectarían a nadie. No obstante el problema aparecía cuando esta interfaz empezaba a crecer de una manera desorganizada, al ir añadiendo los metodos que se iban desarrollando al extender la funcionalidad. La solución a este problema pasa por definir dos capas. La que será la capa de interfaz, en la que se pueden desarrollar muchas interfaces especializadas y otra capa que será en la que se defina la implementación. &lt;/p&gt;&lt;p&gt;  Podeis encontrar articulos sobre este principio en&lt;/p&gt;&lt;p&gt;        &lt;a href=&quot;http://www.objectmentor.com/resources/articles/isp.pdf&quot;&gt;http://www.objectmentor.com/resources/articles/isp.pdf&lt;/a&gt;&lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/794_principio_de_segregacion_de_las_interfaces_interface_segregation_principle_isp.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/794_principio_de_segregacion_de_las_interfaces_interface_segregation_principle_isp.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/794_principio_de_segregacion_de_las_interfaces_interface_segregation_principle_isp.html</guid>
      <author>Kohonen</author>
      <category>Principios de Orientacion a Objetos</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Portal de Agile-Spain renovado</title>
   <description>&lt;p&gt;Tras una temporada trabajando en la nueva versión del portal de &lt;a href=&quot;http://www.agile-spain.com/&quot;&gt;www.agile-spain.com&lt;/a&gt; , hemos sacado a la luz la nueva versión de portal. Hemos intentado poner a disposición de las personas que lo visiten herramienta que permitan que esta comunidad vaya creciendo y enriqueciendose con la colaboración de todo el que lo desee. En ese sentido hay Foros de discusión, herramientas para aportar noticias, blogs personalizados, encuestas.. &lt;/p&gt;&lt;p&gt; Os invitamos a que lo conozcais y a que nos envies cualquier sugerencia para poder hacerlo cada día mas interesante para todos.&lt;/p&gt;&lt;p&gt;  Un saludo&lt;/p&gt;&lt;br/&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/778_portal_de_agile-spain_renovado.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/778_portal_de_agile-spain_renovado.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/778_portal_de_agile-spain_renovado.html</guid>
      <author>Kohonen</author>
      <category>General</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Curso de Java Gratuito</title>
   <description>&lt;p&gt;Publico la información de este curso de Java porque me ha parecido muy interesante el temario (a parte de porque es gratuito). Adoptar las tecnologías que se tratan en el curso en nuestro proyectos web, representarán sin duda refactorizaciones que permitirán que nuestro desarrollo crezca ordenadamente. No obstante, siempre estudiando que la complejidad que introducimos se ve recompensada en la estructura de nuestro código (no solo en la satisfacción técnica personal de trabajar con la última tecnología)&lt;/p&gt;&lt;a href=&quot;http://www.programacion.com/blogs/14_refactoring/resources/becas_programadores2.gif.html&quot;&gt;Curso Java Gratuito&lt;/a&gt; &lt;p /&gt;&lt;br/&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/697_curso_de_java_gratuito.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/697_curso_de_java_gratuito.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/697_curso_de_java_gratuito.html</guid>
      <author>Kohonen</author>
      <category>General</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Agrupar Jerarquias (Collapse Hierarchy)</title>
   <description>&lt;p&gt;¿Hemos conseguido que nuestro diseño quede perfecto? ¿Hemos conseguido que nuestro diseño se adapte a los requisitos que teniamos?. A veces conseguimos lo primero a base de hacer un sobre-diseño que no utilizaremos. Pero tampoco hay que castigarse,  en el fondo a todos nos gusta la complejidad. Lo simple no vende nada, bueno miento, no vende nada sobre papel, porque en la realidad cuanto mas simple sea una solución menos coste de desarrollo tendremos y menos nos costará extenderla.&lt;/p&gt;&lt;br/&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;br /&gt;* Situación inicial: Observamos que tenemos una subclase que prácticamente no añade nada a la superclase.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Refactorización: Eliminar la subclase añadiendo añadiendo extendiendo la superclase con las pequeñas diferencias.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Situación final: Evitamos tener clases en las que prácticamente no haya código.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt; &lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt; &lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;pre&gt; &lt;img src=&quot;http://www.refactoring.com/catalog/collapseHier.gif&quot; /&gt;&lt;/pre&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Url&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.refactoring.com/catalog/collapseHierarchy.html&quot;&gt;http://www.refactoring.com/catalog/collapseHierarchy.html&lt;/a&gt;&lt;a href=&quot;http://www.refactoring.com/catalog/removeParameter.html&quot;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Comentarios&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;   Esta es la ultima refactorización del grupo de refactorizaciones para evitar la generalización especulativa. En este caso estamos eliminando una herencia que no estaba justificada. Volver a ella no será dificil, si en nuestros requisitos cambian y nos conducen a hacerla de nuevo. &lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;   Si trabajamos con control de Versiones no será dificil de recuperar versiones anteriores de nuestro código. Esto nos evitará el ir acumulando en nuestro proyecto codigo que no se utiliza y que conforme pase el tiempo tendremos mucho mas dificil de eliminar. Esto ocurrirá porque no sabremos exactamente si lo estamos utilizando o no, y averiguarlo nos llevará un tiempo que no tenemos. Por ese motivo yo soy partidario de eliminar del proyecto todo aquello que no vaya a ser utilizado, en el mismo momento en el que lo detectamos, confiando en que nuestro control de versiones podrá volver a recuperla si en algún momento lo necesitamos. El efecto de ir dejando cosas sin eliminarlas, es el efecto &amp;quot;trastero&amp;quot;,  si comenzamos a almacenar cosas que nunca utilizaremos luego será mucho mas complicado tener facilmente accesibles las que realmente si necesitamos utilizar mucho mas frecuentemente, haciendo que al final esta politica nos haga mucho mas dificil acceder a lo que realmente importa. En el caso del trastero supone que al final no le sacaremos toda la utilidad que tiene (por ejemplo como despensa).&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;   Utilizar la herencia donde no se necesita, es sin duda una forma de tener nuestro código mucho mas divido de lo que nos hubiera hecho falta.&lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/615_agrupar_jerarquias_collapse_hierarchy.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/615_agrupar_jerarquias_collapse_hierarchy.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/615_agrupar_jerarquias_collapse_hierarchy.html</guid>
      <author>Kohonen</author>
      <category>Refactorizaciones de Código</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Diseño abierto pero cerrado : (The Open Closed Principle)</title>
   <description>Uno de los principios que he encontrado en un libro de Robert C. Martin es el Principio de Diseño Abierto pero Cerrado (The Open Closed Principle). Este principio viene a decirnos que en nuestro diseño nuestras entidades de software (Clases, Modulos, Funciones) deben estar dispuestas a ser extendidas, pero debemos evitar modificarlas.&lt;br /&gt;  &lt;br/&gt;&lt;p&gt;Este principio viene a decirnos que en nuestro diseño nuestras entidades de software (Clases, Modulos, Funciones) deben estar dispuestas a ser extendidas, pero debemos evitar modificarlas.&lt;/p&gt;&lt;p&gt;En otras palabras debemos de ser capaces de modificar el comportamiento de nuestro software sin tener que modificar el codigo fuente ya existente. Aunque pueda sonar contradictorio la clave para conseguir que nuestro diseño nos permite facilmente añadir nuevos coportamientos esta en la abstracción. El diseño orientado a objetos es una potente herramienta que nos permite utilizar la abstracción para conseguir nuestro objetivo.&lt;/p&gt;&lt;p&gt;Utilizando los principio de la programación orientada a objeto podemos crear abstracciones mas bien fijas y tendentes a no ser modificadas que agruparan aun grupo ilimitado de de comportamientos posibles. Estas abstracciones son las que conseguimos cuando en nuestro diseño incluimos clases abstractas y los posible comportamientos serán el conjunto de clases derivadas de la clase abstracta. Con este diseño seremos capaces de crear nuevas clases derivadas, añadiendo nuevos comportamientos,  sin necesidad de modificar otras clases. Con este diseño seremos capaces de añadir nuevas subclases de forma sencilla sin necesidad de modificar el codigo ya existente (la clase abstracta y las subclases ya existentes), cumpliendo por tanto con el Principo de Diseño Abierto pero Cerrado (OPC)&lt;/p&gt;&lt;p&gt;Uno de los malos olores que podemos detectar en nuestro código si estamos violando este principio será la presencia de if y switchs. Eso se deberá a que probablemente estemos utilizando en nuestras clases atributos que indican el tipo de objeto ante el que nos encontramos y que se utilizarán para modificar el comportamiento de ciertos metodos. Esto implicará que en cada metodo de nuestra clases tendremos un if o un switch que decidirán el comportamiento en función de estos atributos. Para añadir un nuevo comportamiento será necesario introducir en todos estos puntos la nueva opción y el codigo asociado al nuevo comportamiento de esta opción. Estaremos violando el Princio de Diseño Abierto pero Cerrado, porque estaremos modificando el código ya existente y porque nuestra aplicación será cada vez mas dificil de extender.&lt;/p&gt;&lt;p&gt;Un ejemplo de diseño que viola el principio es que el podemos encontrar a la izquierda. Con la Refactorizacion sugerida  (&lt;u&gt;SustituirCodigoDeTipoConSubclases&lt;/u&gt; &lt;a href=&quot;http://www.refactoring.com/catalog/replaceTypeCodeWithSubclasses.html&quot;&gt;http://www.refactoring.com/catalog/replaceTypeCodeWithSubclasses.html&lt;/a&gt;) obtenemos un diseño que si que cumple este principio.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.refactoring.com/catalog/repTypeCodeWithSubclass.gif&quot; /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Podemos encontrar información sobre este principio en la siguiente direccion&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/ocp.pdf&quot;&gt;http://www.objectmentor.com/resources/articles/ocp.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/598_diseo_abierto_pero_cerrado__the_open_closed_principle.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/598_diseo_abierto_pero_cerrado__the_open_closed_principle.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/598_diseo_abierto_pero_cerrado__the_open_closed_principle.html</guid>
      <author>Kohonen</author>
      <category>Principios de Orientacion a Objetos</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>¿En que casos debemos comentar nuestro código?</title>
   <description>En este articulo podemos encontrar una interesante reflexión sobre que tipo de comentarios son realmente utiles en nuestro código. No es una buena practica, como dice Martin Fowler, utilizar los comentarios como desodorante para los malos oleres de nuestro código&lt;br/&gt;&lt;p&gt;En este articulo podemos encontrar reflexiones en mi opinión muy interesantes:&lt;/p&gt;&lt;p&gt; * Si nuestro código es de mala calidad, utilizar un comentario para facilitar su claridad no es la mejor forma de solucionar el problema. Si encontramos malos olores en nuestro código, utilizar los comentarios a modo desodorante es una mala elección. Mejor es corregirlo&lt;/p&gt;&lt;p&gt; * Tenemos que intentar que nuestro código hable por si solo. Si tratamos de explicar lo que hace nuestro código estaremos duplicando información que en cualquier momento puede diferir.&lt;/p&gt;&lt;p&gt; * Una correcta nomenclatura y un diseño simple evitaría la gran mayoría de comentarios que solemos utilizar.&lt;/p&gt;&lt;p&gt;Aqui podeis encontrar el articulo, donde trata de explicar lo que el considera comentarios valiosos.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.stickyminds.com/testing.asp?Function=edetail&amp;amp;ObjectType=ART&amp;amp;ObjectId=9041&amp;amp;tth=DYN&amp;amp;tt=siteemail&amp;amp;iDyn=3&quot;&gt;http://www.stickyminds.com/testing.asp?Function=edetail&amp;amp;ObjectType=ART&amp;amp;ObjectId=9041&amp;amp;tth=DYN&amp;amp;tt=siteemail&amp;amp;iDyn=3&lt;/a&gt;&lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/577_en_que_casos_debemos_comentar_nuestro_cdigo.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/577_en_que_casos_debemos_comentar_nuestro_cdigo.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/577_en_que_casos_debemos_comentar_nuestro_cdigo.html</guid>
      <author>Kohonen</author>
      <category>Articulos de Referencia</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
    <item>
   <title>Eliminar parametros (Remove Parameter)</title>
   <description>&lt;p&gt;¿Tenemos metodos que utilizamos pasando siempre el mismo valor en uno de sus parametros?. ¿Esta este valor documentado para que una persona que lo utilice sepa cual es el valor que debe de pasar? ¿Hemos definido ese parametro porque pensamos que lo utilizaremos en el futuro?. Creo que es momento de aplicar el &amp;quot;CARPE DIEM&amp;quot; y vivir el presente ;).&lt;/p&gt;&lt;br/&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;br /&gt;* Situación inicial: Un parametro no es utilizado en la clase o siempre se utiliza pasando el mismo valor.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Refactorización: Eliminar el parametro del metodo.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;* Situación final: Si no se utilizaba no será necesario modificar la clase, si se utilizaba el mismo hay dos soluciones, instanciar ese valor dentro del metodo. Podemos también sobrecargar el metodo de forma que creemos una nuevo metodo sin este parametro que instancie el valor por defecto y llame al original con ese valor.&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt; &lt;/div&gt;&lt;div class=&quot;blogbody&quot;&gt;&lt;/div&gt;&lt;pre&gt; &lt;img src=&quot;http://www.refactoring.com/catalog/removeParam.gif&quot; /&gt;&lt;/pre&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Url&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.refactoring.com/catalog/removeParameter.html&quot;&gt;http://www.refactoring.com/catalog/removeParameter.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;blogbody&quot;&gt;&lt;strong&gt;Comentarios&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Esta es un refactorización que pertenece al grupo de refactorizaciones que atacan al problema de la generalización especulativa. Este tipo de metodos es facil detectarlos cuando observamos que en todas las llamadas que hacemos siempre pasamos el mismo parametro. Bien pasando un valor que es nulo, o bien pasando un valor por defecto que es el que utilizarmos siempre.&lt;/p&gt;&lt;p&gt;Si tenemos esta situación lo mejor será eliminar ese parametro hasta que realmente sea necesario. Si al final fuera necesario, no tenemos mas que recuperarlo de nuestro control de versiones ese código y añadirlo a nuestra clase. Generalmente en ese momento tendremos una necesidad real de pasar ese parametro y seamos capaces de encontrarle un nombre con mucho mas sentido que los que solemos generar cuando estamos especulando necesidades futuras.&lt;/p&gt;&lt;p&gt; Cuando creamos un parametro de este tipo, estamos haciendo que nuestro código se entienda un poco peor. Los metodos con una larga lista de parametros son siempre mas complicados de entender y de utilizar. Si a esto le sumamos que uno de los parametros esta pensando para una utilidad futura, eso implicará que deberemos conocer el valor que debemos pasarle por defecto mientras tanto.  &lt;/p&gt;&lt;p&gt; Enfrentarnos a los problemas cuando los tengamos es en general una mejor política que tratar de solucionar a priori todos nuestros futuros problema. Porque tratar de hacerlo hará nuestro presente mucho mas complicado. &lt;/p&gt;</description>
   <link>http://www.programacion.com/blogs/14_refactoring/archive/565_eliminar_parametros_remove_parameter.html</link>
   <comments>http://www.programacion.com/blogs/14_refactoring/archive/565_eliminar_parametros_remove_parameter.html</comments>
   <guid>http://www.programacion.com/blogs/14_refactoring/archive/565_eliminar_parametros_remove_parameter.html</guid>
      <author>Kohonen</author>
      <category>Refactorizaciones de Código</category>
   <source url="http://www.programacion.com/blogs/14_refactoring/feeds/rss20">Refactoring</source>
  </item>
   </channel>
</rss>