<?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>Software Guisho</title>
	<atom:link href="http://software.guisho.com/feed" rel="self" type="application/rss+xml" />
	<link>http://software.guisho.com</link>
	<description>Hablemos un poco de software con ñ.</description>
	<lastBuildDate>Tue, 23 Feb 2010 15:02:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>El Rol Del Email en un Proyecto</title>
		<link>http://software.guisho.com/el-rol-del-email-en-un-proyecto</link>
		<comments>http://software.guisho.com/el-rol-del-email-en-un-proyecto#comments</comments>
		<pubDate>Tue, 23 Feb 2010 14:45:38 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[almacenamiento de conocimiento]]></category>
		<category><![CDATA[base de datos de conocimiento]]></category>
		<category><![CDATA[conocimiento]]></category>
		<category><![CDATA[coreo electronico]]></category>
		<category><![CDATA[el rol del correo electronico]]></category>
		<category><![CDATA[el rol del email]]></category>
		<category><![CDATA[email]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=191</guid>
		<description><![CDATA[El correo electrónico, email, es una de las herramientas más utilizadas como medio de comunicación en un proyecto de software. A través del email se establece comunicación con los clientes y entre los miembros del equipo de desarrollo. Usualmente el uso del email se extiende a todos los ámbitos del proyecto: factibilidad, levantado de requerimientos, [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2010/02/email.jpg"><img class="alignleft size-medium wp-image-192" title="email" src="http://software.guisho.com/wp-content/uploads/2010/02/email-300x299.jpg" alt="" width="300" height="299" /></a>El correo electrónico, email, es una de las herramientas más utilizadas como medio de comunicación en un proyecto de software. A través del email se establece comunicación con los clientes y entre los miembros del equipo de desarrollo. Usualmente el uso del email se extiende a todos los ámbitos del proyecto: factibilidad, levantado de requerimientos, desarrollo, mantenimiento, resolución de dudas, propuestas de ideas, y un gran etcétera.</p>
<p>Aunque el email es una gran herramienta, en la actualidad hay un &#8220;sobre uso&#8221; del correo. Para absolutamente todo se hace un nuevo mail. Y en muchas ocasiones, el email no es la mejor herramienta para solucionar los problemas. Quiero aclarar que estoy hablando de proyectos de chicos a medios, proyectos en los que una empresa naciente se involucra. Para proyectos más grandes hay otras herramientas que generalmente se utilizan, que de no utilizarse no sería posible el desarrollo en gran escala.</p>
<p><span id="more-191"></span></p>
<p>Este es un tema de manejo de proyectos, asunto sobre el cual quiero dedicarle algunos posts. El manejo de proyectos es uno de los grandes puntos grises del desarrollo de software, y un área que poco interés se suele poner en las empresas. Cada vez más me convenzo de que un buen software está íntimamente ligado a un buen manejo de proyecto.</p>
<p>Pero volviendo al tema, NO ES SENSATO utilizar el mail para todo. Seguro les ha tocado más de una ocasión buscar un documento que enviado por un cliente, que sabe Dios dónde se encuentra en su inbox (o su respectiva carpeta o tag). Y luego de 20 minutos de búsqueda el archivo buscado estaba en un mail con &#8220;No Subject&#8221; que su cliente envío hace un par de meses. O quieren ver la versión de la especificación en la que se contemplaba x o y característica del producto que ahora ya no está contemplada, o la fecha de entrega, etc.</p>
<p>Y dependiendo del rol que cumplan en el proyecto, la avalancha de mails puede parecerles SPAM. Si ustedes son parte del equipo de ventas, pero están incluídos en el CC (y son uno de los 25 destinatarios de CADA mail del proyecto) le perderán la pista a las cosas importantes. Además cada quien tiene una configuración distinta para responder, y de pronto la &#8220;conversación&#8221; se vuelve un hilo de mails que pocos entienden.</p>
<p>El email funciona muy bien para muchas cosas, pero cada vez veo más claro que como método de almacenamiento de conocimiento no es una buena herramienta. Como menciono hay herramientas alternativas, software para manejar proyectos, para almacenar documentos, etc. Pronto haré una lista de software disponible para esto. Hay herramientas que almacenan mejor el conocimiento, que lo pueden indexar de distintas maneras, que pueden buscar relaciones, que pueden intentar estructurar el conocimiento, y que no excluyen el email. Hay algunas herramientas que consideran los replys de los mails&#8230;y es una gran cosa.</p>
<p>Una lista de razones por las que considero que hay que buscar alternativas al mail para manejar el flujo de información en un proyecto:</p>
<ul>
<li>El conocimiento se vuelve, hasta cierto punto restringido. Sólo los destinatarios poseen el conocimiento sobre el proyecto, lo que de principio le reduce la vida. Claro, hay cosas confidenciales, pero hay muchas otras que son del interés común tanto de la empresa proveedora como el cliente.</li>
<li>Es sumamente complicado de organizar. Aunque ahora existen maneras eficientes de manejar cada correo de entrada, los correos en los que se tratan distintos temas, se vuelven un desafío.</li>
<li>Mucha información puede volverse ruido. Si todas las mail de un proyecto se van a la carpeta &#8220;Proyecto X&#8221; de nuestro manejador de correo, de pronto tendremos una carpeta con miles de correos que no nos sirven, a lo más para hacer búsquedas.</li>
<li>No se escriben buenos mails. Abundan los mail con subjects malos, los mails de más, los mails mal escritos, los mails que no dicen nada, o que dicen algo en mucho, etc. Que es otro tema que algún día tocaremos, cómo y porque escribir buenos mails.</li>
</ul>
<p>Pero hay un punto importante: mucha de la información sobre el proyecto sale del cliente, y el cliente USA EL EMAIL, y hacerlo utilizar otra herramienta, es prácticamente imposible. Así que la solución que se utilice DEBE usar el mail como interfase. Irónico pero cierto. Intentar que el cliente use &#8220;nuestra herramienta&#8221; es algo difícil de lograr, así que el mail debe ser utilizado, pero con un nuevo enfoque.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fel-rol-del-email-en-un-proyecto&amp;linkname=El%20Rol%20Del%20Email%20en%20un%20Proyecto"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/el-rol-del-email-en-un-proyecto/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</title>
		<link>http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno</link>
		<comments>http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno#comments</comments>
		<pubDate>Thu, 19 Nov 2009 21:41:37 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[adaptador]]></category>
		<category><![CDATA[adapter pattern]]></category>
		<category><![CDATA[patron adaptador]]></category>
		<category><![CDATA[patron adapter]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[wrapper]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=179</guid>
		<description><![CDATA[El patrón creacional que ahora vamos a analizar es muy eficaz así como sencillo. Se puede utilizar en muchos contextos y es de especialidad utilidad cuando se utilizan códigos o librerías ajenos al que estamos utilizando y sobre el que no tenemos control. Este patrón se le conoce como adaptador o adapter en inglés, aunque [...]


Related posts:<ol><li><a href='http://software.guisho.com/prototype-pattern-patron-prototipo-patrones-de-diseno' rel='bookmark' title='Permanent Link: Prototype Pattern &#8211; Patron Prototipo &#8212; Patrones de diseño'>Prototype Pattern &#8211; Patron Prototipo &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/11/adaptador.jpg"><img class="alignleft size-full wp-image-181" title="adaptador" src="http://software.guisho.com/wp-content/uploads/2009/11/adaptador.jpg" alt="adaptador" width="240" height="240" /></a>El patrón creacional que ahora vamos a analizar es muy eficaz así como sencillo. Se puede utilizar en muchos contextos y es de especialidad utilidad cuando se utilizan códigos o librerías ajenos al que estamos utilizando y sobre el que no tenemos control. Este patrón se le conoce como adaptador o adapter en inglés, aunque algunos lo llaman también wrapper, que viene siendo con envoltorio. Ambos nombres tienen bastante sentido y explican el por qué de este patrón.</p>
<p><span id="more-179"></span></p>
<p>Antes de comenzar con código o parecido, pensemos en este problema. En muchos países se utilizan las espigas redondas en los tomacorrientes, y en otros las espigas planitas. Otras veces nuestro aparato tiene 3 espigas y el tomacorrientes 2. Sin embargo sabemos que el aparato que deseamos conectar &#8220;entiende&#8221; la corriente eléctrica, &#8220;la acepta&#8221;, aunque la interfaz para conectarse a ella sea una distinta a la nuestra. ¿Qué hacemos en estos casos? Usamos un adaptador! O un convertidor, o un transformador, cómo le querramos llamar.  Pues lo mismo sucede con el software. A veces hay librerías que nos son útiles pero que para utilizarlas nos teneoms que adaptar a ellas. Tenemos dos opciones: modificar todo nuestro código para que se adapte a la librería, o podemos crear un adaptadro que traduzca lo nuestro a lo de ellos y lo de ellos a lo nuestro. Un ejemplo sencillo en el mundo Java es el de los Enumeration y los Iterators. Ambos tienen un hasNext()  o  un hasMoreElements() que hacen lo mismo; al igual que un next() y un nextElement() que hacen lo mismo. Imaginemos todo lo queremos manejar con Iterators, podemos crear un adaptador que nos &#8220;convierta&#8221; entre Iterator y Enumeration.</p>
<p>Vamos con el usual ejemplo. Imaginemos tenemos un sistema que maneja coches, barcos, aviones y parecidos. Generalmente los motores que se usan son de gasolina, pero las nuevas tendencias han popularizado los motores eléctricos. Para simplificar mi caso y mostra bien el punto, tenemos que el proveedor de vehículos eléctricos nos provee sus librerías para el motor eléctrico que es prácticamente igual a nuestras implementaciones pero con otros nombres (prender en vez de encender, &#8220;mover más rápido&#8221; en vez de acelerar, etc.), y tiene una restricción extra: para poder acelerar o detener el motor, este tiene que estar conectado. Y surge el problema ¿cómo hacemos para nuestras librerías puedan hacer uso del motor eléctrico? Podríamos reescribirlas todas, pero el tiempo que eso nos tomaría sería mucho. Además sabemos que existirían problemas que nuestras librerías ya han solucionado.</p>
<p>Como nos gusta ser elegantes en nuestro uso de objetos, hace muchos años creamos una clase abstracta (pensamos también hacer una interfaz, pero la clase abstracta nos provee otros métodos útiles):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.adapter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Motor <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> encender<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> acelerar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> apagar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">//...mas metodos que hacen muchas cosas</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y tenemos nuestras implementaciones de algunos motores, por ejemplo el motor económico:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.adapter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MotorEconomico <span style="color: #000000; font-weight: bold;">extends</span> Motor <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> MotorEconomico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Craendo motor economico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> encender<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Encendiendo motor economico.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> acelerar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Acelerando motor economico.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> apagar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Apagando motor economico.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y el motor gastón (que ya no se vende tanto!):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.adapter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MotorGaston <span style="color: #000000; font-weight: bold;">extends</span> Motor <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> MotorGaston<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Creando el motor gaston&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> encender<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Bum, bum....encendiendo motor gaston&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> acelerar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Buuuuuuuuuuuum, acelerando y gastando muuuucha gas&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> apagar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Apagando motor gaston&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Estas clases siempre nos han funcionado bien, y de hecho tienen muchas cosas como servicios, mantenimientos y otros, que usamos gracias a la interfaz motor. Por ejemplo es común que usemos cosas como estás:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        Motor motor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorEconomico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">encender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">acelerar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">apagar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #666666; font-style: italic;">//hacer mas cosas....</span>
        motor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorGaston<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">encender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">acelerar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">apagar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ahora la empresa que construye motores eléctricos nos manda su propia implementación que va así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MotorElectrico <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> conectado <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> MotorElectrico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Creando motor electrico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> conectar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Conectando motor eléctrico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> activar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;No se puede activar porque no esta conectado el motor electrico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Esta conectado, activando motor electrico....&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> moverMasRapido<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;No se puede mover rapido el motor electrico porque no esta conectado...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Moviendo mas rapido...aumentando voltaje&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> detener<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;No se puede detener motor electrico porque no esta conectado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Deteniendo motor electrico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> desconectar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Desconectando motor electrico...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">conectado</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como vemos, este motor hace lo mismo que el nuestro, pero de manera y con llamadas un poco diferentes. ¿Cómo hacemos para integrar este MotorEléctrico al resto de nuestro sistema? Así es, con un adaptador o adapter!<br />
El adapter &#8220;envuelve&#8221; al objeto extraño (por eso le llaman wrapper también, ya que wrapper viene siendo envoltorio).</p>
<p>Nuestro adaptador se escribiría así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.adapter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MotorElectricoAdapter <span style="color: #000000; font-weight: bold;">extends</span> Motor<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> MotorElectrico motorElectrico<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> MotorElectricoAdapter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorElectrico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Creando motor Electrico adapter&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> encender<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Encendiendo motorElectricoAdapter&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span>.<span style="color: #006633;">conectar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span>.<span style="color: #006633;">activar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> acelerar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Acelerando motor electrico...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span>.<span style="color: #006633;">moverMasRapido</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> apagar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Apagando motor electrico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span>.<span style="color: #006633;">detener</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">motorElectrico</span>.<span style="color: #006633;">desconectar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como ven el adapter se encarga no solo de corregir los nombres de los métodos, sino también cosas como conectar y desconectar el motor, cosas que a nuestra implementación no le importan. Pero lo más importante es que ahora podemos utilizar esta implemetnación de Motor en nuestro sistema utilizando la implementación de ellos. Por ejemplo podemos hacer cosas como esta:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        Motor motor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorEconomico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">encender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">acelerar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">apagar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        motor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorGaston<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">encender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">acelerar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">apagar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        motor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MotorElectricoAdapter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">encender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">acelerar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        motor.<span style="color: #006633;">apagar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>El patrón adapter aparece en todos lados, aunque muchas veces no se le llama adapter específicamente. Ahora que lo conocemos lo podemos usar en nuevos proyectos, o tal vez puede solucionarlos problemas que resolvimos a medias en algún software por ahí. Como siempre les <a href="http://software.guisho.com/wp-content/uploads/2009/11/adapter.zip">dejo el código fuente.</a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fpatron-adaptador-pattern-adapter-patrones-de-diseno&amp;linkname=Patron%20Adaptador%20%26%238211%3B%20Pattern%20Adapter%20%26%238211%3B%20Patrones%20de%20dise%C3%B1o"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/prototype-pattern-patron-prototipo-patrones-de-diseno' rel='bookmark' title='Permanent Link: Prototype Pattern &#8211; Patron Prototipo &#8212; Patrones de diseño'>Prototype Pattern &#8211; Patron Prototipo &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>El ejemplo del constructor</title>
		<link>http://software.guisho.com/el-ejemplo-del-constructor</link>
		<comments>http://software.guisho.com/el-ejemplo-del-constructor#comments</comments>
		<pubDate>Mon, 17 Aug 2009 21:18:03 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[albañil]]></category>
		<category><![CDATA[desarrollo de software]]></category>
		<category><![CDATA[inofrmáticos albañiles]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=174</guid>
		<description><![CDATA[Hace ya algunos años lei por primera vez este texto. Quisiera poner la referencia del autor, pero no encontré quien lo pudo haber escrito,  así que si alguien me dice a quién darle el crédito, con gusto se lo daremos   Aparte de lo gracioso en sí mismo, ahora que lo leo años después, [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/08/albanil.jpg"><img class="alignleft size-medium wp-image-175" title="albanil" src="http://software.guisho.com/wp-content/uploads/2009/08/albanil-300x225.jpg" alt="albanil" width="300" height="225" /></a>Hace ya algunos años lei por primera vez este texto. Quisiera poner la referencia del autor, pero no encontré quien lo pudo haber escrito,  así que si alguien me dice a quién darle el crédito, con gusto se lo daremos <img src='http://software.guisho.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Aparte de lo gracioso en sí mismo, ahora que lo leo años después, desafortunadamente es muy acertado. Digo desafortunadamente, porque tenemos que cambiar la manare de hacer proyectos de software. Urgentemente. Nuevas metodologías, nuevas herramientas, nuevos paradigmas. Actualmente el proceso de hacer software es más complicado de lo que, en mi humilde opinión, debería ser. ¿Qué piensan?</p>
<p><span id="more-174"></span></p>
<p><strong>5 de enero</strong><br />
Hoy me han llevado al lugar de construcción por primera vez. La situación es perfecta: tiene parada de bus cercana y enfrente hay una cafetería con comida casera. El viejo edificio de apartamentos, al que va a sustituir nuestra nueva construcción, lleva un año al borde de la ruina. Mi propia empresa ha colocado varios puntales que, por el momento, han ido evitando que el caduco edificio reviente por sus múltiples grietas. La construcción de este megalito ladrillo comenzó hace cinco años, y aunque los pisos superiores nunca llegaron a recibir el agua, la electricidad y el enfoscado de las paredes, en diez meses los cimientos ya se habían desplazado peligrosamente y las vigas presentaban peligrosas fisuras. La cansada torre de viviendas ya ha cumplido su propósito y ahora nosotros la conduciremos a una muerte dulce&#8230; Por supuesto, el viejo edificio no será demolido hasta después de construir y probar el nuevo, lo que nos deja poco espacio de maniobra; pero no vamos a dejar a todas esas familias en la calle durante la construcción. De cualquier modo, los vecinos de la vieja y decadente estructura nos miran con recelo. Saben que el nuevo edificio tendrá viviendas cómodas, pero algunos de los residentes no podrán costearlas. Ni sé qué va a ser de la gente, ni es asunto mío. Llegan los primeros camiones de ladrillos.</p>
<p><strong>6 de enero</strong><br />
Me han presentado a Matías, la persona a quien &#8220;voy a reportar&#8221;. No me han dicho si es el capataz, el jefe de obra, el aparejador, o el arquitecto; sólo me han dicho que todo lo que tenga que &#8220;reportar&#8221; se lo &#8220;reporte&#8221; a él. Así que, por donde él diga, yo zaca-zaca, como una locomotora. Esa es la definición que me han dado de nuestra metodología. He buscado &#8220;reportar&#8221; en el diccionario, y no aparece.</p>
<p><strong>10 de febrero</strong><br />
En algo más de un mes, hemos cavado medio metro de cimientos. Ayer Matías nos dijo que empezáramos a poner ladrillos, porque el tiempo designado para la cimentación se había agotado hace dos semanas. No aceptó nuestras excusas de que las prometidas excavadoras aún no habían llegado y que nos habíamos visto obligados a cavar con las paletas de enyesar. Un compañero se trajo un pala de cavar que guardaba de una obra anterior y casi le echan por razones deontológicas. Según Matías, lo que pasa es que frecuentamos demasiado la cafetería. El asunto se ha zanjado con un &#8220;hale&#8221;, a levantar paredes y luego que cada palo aguante su &#8220;vela&#8221;. El trabajo sin planos es dificultoso. Los cimientos tienen una forma algo pintoresca. He pedido una plomada para que las paredes queden verticales y he recibido improperios poniendo en duda mi masculinidad. Ya sé que Matías no es el arquitecto, porque el arquitecto es un tal Ignacio. Pasó a supervisar la obra el otro día. Aunque aún no había nada que ver. Me han llegado rumores, aunque no son muy dignos de crédito, de que existen fotocopias de planos.</p>
<p><strong>1 de junio</strong><br />
Anoche estuvimos hasta la siete de la mañana cubriendo con tablas y enmoquetando el espacio que algún día ocupará el despacho de la planta, aunque el edificio no es aún más que una maraña de vigas de todos los tamaños y algunas paredes que habrá que tirar más tarde están en el sitio equivocado. Hemos traído baterías para los fluorescentes y unos muebles de caoba preciosos. Por suerte, todo estuvo a punto para la demo. Izamos al cliente con la grúa hasta su futuro despacho y pudo contemplar la vista que disfrutaría desde el emplazamiento. El viento hizo que la pared oeste, que dos de mis compañeros sujetaban con la espalda, se derrumbara con gran estruendo sobre la mesa de caoba en el peor momento. Gracias a Dios, el cliente fue comprensivo: esto pasa siempre en las demos, y él está curado de espanto, dijo mientras el sacudíamos el polvo del traje. Dice que el lunes que viene vendrá a probar las instalaciones sanitarias. Supliremos con cubos la inexistencia de tuberías.</p>
<p><strong>5 de marzo</strong><br />
Han transcurrido casi catorce meses. Llevamos ya siete de retraso y el edificio no acaba de superar el estado de &#8220;casi terminado&#8221;. Soy de los pocos albañiles que no ha cambiado de obra en este tiempo. Matías está consumido por la zozobra y se pasa el día en la cafetería trasegando Soberanos. El arquitecto no ha vuelto a pasar por aquí. Los rumores dicen que existieron unos planos, pero no eran de un bloque de pisos, sino de un polideportivo. Por lo visto, en las reuniones del comité de construcción se dijo que la filosofía era la misma y que sólo harían falta modificaciones mínimas. Ahora comprendo por qué nos hicieron instalar aros de baloncesto en el hueco del ascensor. Siempre dije que acabaríamos teniendo que quitarlos o aquello no era un hueco de ascensor, que era cuestión de lógica. Matías siempre me contestaba que no le viniera con tecnicismos. Estoy perdiendo la vocación de constructor. He decidido apuntarme por las tardes a un curso de informática, a ver si puedo cambiar de vida. Este oficio mío no es serio.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fel-ejemplo-del-constructor&amp;linkname=El%20ejemplo%20del%20constructor"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/el-ejemplo-del-constructor/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NTR: No Te Repitas (DRY: Don&#8217;t Repeat Yourself)</title>
		<link>http://software.guisho.com/ntr-no-te-repitas-dry-dont-repeat-yourself</link>
		<comments>http://software.guisho.com/ntr-no-te-repitas-dry-dont-repeat-yourself#comments</comments>
		<pubDate>Sun, 21 Jun 2009 18:40:01 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[dont repeat yourself]]></category>
		<category><![CDATA[dry principle]]></category>
		<category><![CDATA[no te repitas]]></category>
		<category><![CDATA[pragmatic programmer]]></category>
		<category><![CDATA[principio dry]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=169</guid>
		<description><![CDATA[Hace algunos años ya me topé con el libro &#8220;Pragmatic Programmer&#8221;  de Andrew Hunt y David Thomas. Aconsejo a todos los que tengan la oportunidad que adquieran el libro y le den una buena leída. Muestra de manera clara muchas verdades que conocemos, pero que realmente pocas veces aplicamos. Algún día escribiré un post del [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/06/funny_hatchet.jpg"><img class="alignleft size-medium wp-image-171" title="funny_hatchet" src="http://software.guisho.com/wp-content/uploads/2009/06/funny_hatchet-223x300.jpg" alt="funny_hatchet" width="223" height="300" /></a>Hace algunos años ya me topé con el libro <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">&#8220;Pragmatic Programmer&#8221;  de Andrew Hunt y David Thomas</a>. Aconsejo a todos los que tengan la oportunidad que adquieran el libro y le den una buena leída. Muestra de manera clara muchas verdades que conocemos, pero que realmente pocas veces aplicamos. Algún día escribiré un post del libro. Pero hoy quiero enfocarme en el DRY Principle. A este principio se le conoce también como &#8220;single point of thruth&#8221; o &#8220;punto único de verdad&#8221;.</p>
<p>El principio establece que, en un entorno informático, la información no debe repetirse. Es decir, el conocimiento almacenado en un programa informático debe mantenerse en un, y sólo en un, lugar. De primas a primeras, el principio parece evidente, pero cuando investigamos algunas piezas de código, incluso las nuestras, nos damos cuenta que constantemente violamos el principio.</p>
<p><span id="more-169"></span></p>
<p>Para aclarar el concepto vamos con un ejemplo, harto común, con el que nos topamos constantemente. Supongamos que estamos haciendo una parte de un sistema en el cual se almacenará un catálogo de productos, digamos de frutas. Normalmente lo que haríamos es primero crear la base de datos. En la base de datos se tendrían estos campos: id, código, nombre, precio. En la misma base de datos agregamos ciertas restricciones al producto: el código es único y es una cadena de 10 caracteres, el nombre no puede ir vacío, el precio no pueden ser cero (observemos que incluso los tipos de esos datos radican en la creación de la tabla en la base de datos).</p>
<p>Una vez creada la base de datos, nos dirigimos a nuestro IDE para crear el código que trabajará con esos datos. Los enfoques varían mucho, y las maneras de trabajar con esos datos también. Pero en este caso vamos a trabajar con una capa de persistencia basada en un ORM (Object-Ralational Mapping). En algún lado de la configuración del ORM estableceremos que la tabla fruta se mapeará al objeto Fruta. Que el objeto Fruta tendrá un id, un nombre, un código y un precio.</p>
<p>Con nuestro mapeo funcionando, nos dirigimos a crear nuestro objeto Fruta. Nuestro objeto tendrá un BigInt para el id, tendrá un String para el código, otro para el nombre y un BigDecimal para el precio. Ahora crearemos los métodos de accesos (accessor methods) con su set y su get. Si la capa de persistencia nos echa una mano no tendremos que verificar que el código sea único, pero si no, tendremos que codificarlo nosotros.</p>
<p>Ahora, si somos queremos que nuestro código sea escalable y pueda mantenerse a largo plazo, utilizaremos alguna implementación del patrón MVC (Model-View-Controller, o Modelo-Vista-Controlador). En cada uno pondremos los respectivos campos de la fruta: el id, el código, el nombre y el precio. Haremos un listado de las frutas que hay almacenadas, y una forma para agregar y/o editar entradas.  En la vista le diremos al controlador qué desplegar, y haremos una tabla en el View. El model ya lo implementamos, que es nuestro objeto Fruta. Para la forma haremos lo mismo, pondremos los campos de fruta y lo guardaremos. Para proteger nuestro modelo haremos algunas validaciones del lado del servidor, pero para darle una experiencia interactiva al usuario, también haremos validaciones en el lado del cliente. Usaremos, claro está, uno de esos bonitos frameworks que ahora nos hacen la vida más fácil con javascript. La validación del código único requerirá una llamada de Ajax, y las demás serán simples validaciones con Javascript.</p>
<p>Ahora estamos a punto con el manejo de frutas en el sistema. Tenemos un diseño robusto, altamente escalable, muy legible. Pasamos nuestro trabajo orgullosos a control de calidad. Control de calidad nos informa que el máximo de caracteres de código es 10 y en el javascript del cliente nosotros pusimos 10. Bueno, un teclazo de más a cualquiera le pasa, ¿no?. Pasado un tiempo nos dicen que en el mapeo del ORM no pusimos correctamente el precio, y permitimos que sea vacío. Cosas, la prisa hizo que se nos pasara por alto. Pero pasado todo eso, todo bien.<br />
Pasados unos días, nos mandan un requerimiento del cliente que pide que el código en vez de ser de 10 caracteres va a ser de 15 (cambiaron un par de cosas del negocio), y que hará falta otro código: el código de bodega que será de 20 caracteres y también hará falta el peso unitario, que será un decimal opcional.<br />
En nuestra mente comienza a correr el tedioso proceso que tenemos que realizar: hacer los cambios en la base de datos, hacer los cambios en el mapeo, hacer los cambios en el objeto fruta, hacer los cambios en el controller y en el view para la lista, hacer los cambios en el controller y en el view (que incluye dos validaciones de javascript). Que tedio no????? Además&#8230;.qué fácil será confundirnos.</p>
<p>A todo esto la documentación estaba ya lista, y habrá que cambiarla, pero por falta de tiempo creemos que se quedará tal y como está.</p>
<p>He aquí lo que nos pasa cuando violamos el principio DRY. El principio DRY establece que la información, o el conocimiento debe estar almacenado en UN SOLO LUGAR, para evitar el tedio de cambiar las cosas en mil lados cuando hacen falta cambios, además de ahorrarnos la tendencia a cometer errores cuando hay que cambiar muchas cosas que significan lo mismo. Analicemos los cambios: agregar un campo y modificar otro. Este conocimiento, en gran parte está almacenado en la base de datos (aunque no todo, por ejemplo en la base de datos no podemos hacer ciertas validaciones para los códigos, o cosas parecidas).</p>
<p>Por eso ideas como las aplicadas por ruby (convención sobre configuración) han sido muy populares últimamente. Grails ofrece también un enfoque bonito. Por ejemplo, si cambio las restricciones en mi setter de fruta, ¿no sería menester que esas restriccinoes se extendieran a todos lados? Agrego un campo en mi clase, agrego pesoUnitario, ¿no se deberían propagar estos cambios a la base de datos, a los controllers, a los views, al javascript, a la documentación? Por ello también soy un fan de la generación de código: permite reducir la redundancia de la información.</p>
<p>Nadie negará la utilidad de patrones como el MVC, o de ideas como el ORM. Pero a veces esas soluciones crean una sobre ingeniería tan grande que no sé si compensan sus soluciones. En nuestros tiempos donde los IDEs son tan poderosos nos deberían ayudar un poco más en este tema. No hablo de herramientas CASE, hablo de un nuevo enfoque de programación. Esperemos en el futuro surjan ideas y solucinoes nuevas (en las que espero ustedes y yo aportemos nuestra parte) para este problema de la constante violación del DRY. Programar debe simplificarse mucho. Hemos desarrollado soluciones a soluciones y cada año hay nuevas propuestas, pero siento lo mismo que hablaba una vez con alguien: estamos haciendo el mango del hacha más bonito, más durable, más ergonómico, más resistente a golpes&#8230;cuando lo que deberíamos estar haciendo es diseñando una sierra eléctrica!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fntr-no-te-repitas-dry-dont-repeat-yourself&amp;linkname=NTR%3A%20No%20Te%20Repitas%20%28DRY%3A%20Don%26%238217%3Bt%20Repeat%20Yourself%29"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/ntr-no-te-repitas-dry-dont-repeat-yourself/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patrones estructurales (structural patterns)</title>
		<link>http://software.guisho.com/patrones-estructurales-structural-patterns</link>
		<comments>http://software.guisho.com/patrones-estructurales-structural-patterns#comments</comments>
		<pubDate>Fri, 19 Jun 2009 17:06:57 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones estructurales]]></category>
		<category><![CDATA[structural patterns]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=165</guid>
		<description><![CDATA[ 
Vimos ya los patrones creacionales más importantes. No son todos, en el futuro veremos más, pero son los más usados y los más importantes. Ahora comenzamos con una nueva fase: Los patrones estructurales. Los patrones estructurales (structural patterns) podrían llamarse patrones de relaciones, o algo parecido, porque su principal función es facilitar y mejorar las [...]


Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno' rel='bookmark' title='Permanent Link: Patrones de Diseño'>Patrones de Diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p> </p>
<p><a href="http://software.guisho.com/wp-content/uploads/2009/06/spider.jpg"><img class="alignleft size-medium wp-image-166" title="spider" src="http://software.guisho.com/wp-content/uploads/2009/06/spider-300x270.jpg" alt="spider" width="300" height="270" /></a>Vimos ya los patrones creacionales más importantes. No son todos, en el futuro veremos más, pero son los más usados y los más importantes. Ahora comenzamos con una nueva fase: Los patrones estructurales. Los patrones estructurales (structural patterns) podrían llamarse patrones de relaciones, o algo parecido, porque su principal función es facilitar y mejorar las relaciones entre objetos.</p>
<p><span> </span>En el mundo de objetos, la creación de instancias es muy importante, pero tan importante como la creación, es la manera en la que instancias de objetos se comunican entre sí. Un diseño estandarizado y bien pensado puede facilitar mucho las cosas durante el desarrollo de un sistema grande. En ocasiones nos ponemos a realizar nuestras soluciones a la medida, pero generalmente estas solucionen decaen en construcciones extrañas que serán difíciles de entender para futuros desarrolladores, e incluso para nosotros mismos una vez que dejemos de ver el código.</p>
<p><span id="more-165"></span></p>
<p><span> </span>Una solución elegante es utilizar inteligentemente patrones estructurales. Pero cuidado, puede ser arma de dos filos. Podemos caer en la tentación de meter patrones en todos lados, incluso cuando no es necesario. Nuestro código puede comenzar a crecer y crecer sin hacer aún nada, bajo la premisa de que todo lo queremos hacer con patrones.</p>
<p> </p>
<p><span> </span>Los patrones son una herramienta de diseño muy poderosa, pero hay que saberla utilizar. El tiempo y la experiencia suelen ser los mejores acompañantes para un diseñador de software, porque sólo el tiempo le dará el colmillo para utilizar sus herramientas adecuadamente. </p>
<p> </p>
<p><span> </span>Con mucha frecuencia el diseño de un dominio inicia con nociones sumamente intuitivas. Conforme el diseño se va destilando y mejorando, se agregan soluciones específicas de software (como patrones), que lo pueden ir complicando (con el propósito de hacerlo más manejable). Generalmente los patrones estructurales entran en la jugada en etapas medias del diseño, y muchísimas veces son el resultado de refactorización (refactoring). </p>
<p> </p>
<p> <span> </span>Así que comenzamos con los patrones estructurales. Encendamos motores y preparemos la mente, porque estos patrones son buenos martillos y desatornilladores que podemos meter en nuestra caja de herramientas. Sin dudas algún día nos serán de mucha utilidad en medio de un proyecto, y la gente quedará sorprendida de como resuelves elegantemente los problemas <img src='http://software.guisho.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><a href="http://www.flickr.com/photos/43145783@N00/2124673642/">Foto por.</a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fpatrones-estructurales-structural-patterns&amp;linkname=Patrones%20estructurales%20%28structural%20patterns%29"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno' rel='bookmark' title='Permanent Link: Patrones de Diseño'>Patrones de Diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/patrones-estructurales-structural-patterns/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Empresas que hacen software a la medida Vs. empresas que desarrollan productos</title>
		<link>http://software.guisho.com/empresas-que-hacen-software-a-la-medida-vs-empresas-que-desarrollan-productos</link>
		<comments>http://software.guisho.com/empresas-que-hacen-software-a-la-medida-vs-empresas-que-desarrollan-productos#comments</comments>
		<pubDate>Thu, 04 Jun 2009 01:26:46 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[El Negocio Del Softare]]></category>
		<category><![CDATA[comenzando una empresa]]></category>
		<category><![CDATA[empresa]]></category>
		<category><![CDATA[negocio del software]]></category>
		<category><![CDATA[producto de software]]></category>
		<category><![CDATA[software a la medida]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=153</guid>
		<description><![CDATA[La necesidad de software en el mundo es tan amplia, y de una gama de ambientes tan amplia, que una empresa de software tiene muchas posibilidades al momento de decidir su giro de negocio. Aunque en muchas ocasiones la flexibilidad será la clave para que la empresa crezca, invariablemente llegará un momento en el que [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/06/fork.jpg"><img class="alignleft size-medium wp-image-162" title="fork" src="http://software.guisho.com/wp-content/uploads/2009/06/fork-300x225.jpg" alt="fork" width="300" height="225" /></a>La necesidad de software en el mundo es tan amplia, y de una gama de ambientes tan amplia, que una empresa de software tiene muchas posibilidades al momento de decidir su giro de negocio. Aunque en muchas ocasiones la flexibilidad será la clave para que la empresa crezca, invariablemente llegará un momento en el que la empresa debe tomar la decisión sobre el tipo de empresa que será. Independientemente del nicho de mercado que la empresa decida atacar, hay una decisión que marcará el futuro de la empresa y su manera de trabajo. Y esta bifurcación en el camino tiene dos caras: desarrollar software a la medida, o desarrollar un producto de software bien definido. <span id="more-153"></span></p>
<p>Una empresa que quiere enfocarse en desarrollos a la medida tiene un modus operandi distinto a una empresa que se dedica a desarrollar un producto. Cada elección tiene sus ventajas, sus desventajas, sus riesgos y sus oportunidades. </p>
<h2>Empresa de desarrollo a la medida. </h2>
<p>Por un lado la empresa que hace desarrollo a la medida tiene un método distinto de mercadeo, y en un 99% de veces harán el desarrollo a la medida para empresas. Un tipo muy común en este tipo de empresas son las que se dedican a hacer páginas web. Cada página es distinta y los requerimientos varían entre proyecto y proyecto. </p>
<p>Este tipo de empresa depende totalmente de su personal, y con mucha frecuencia los cobros se hacen por hora o por proyecto. Son empresas con niveles de especialización relativamente bajos, pero con capacidades de desarrollo en una gran cantidad de tecnologías. </p>
<p>Muchas empresas nacen luego de proyectos de outsorsing individuales que redundan finalmente en una empresa dedicada al outsorsing. Las empresas grandes y medianas siempre tienen requerimientos y necesidades nuevas de software, para las cuales simplemente no existen productos porque son tareas demasiado específicas de la empresa. </p>
<p>La gran ventaja de las empresas que desarrollan a la medida es que CASI siempre habrá trabajo. Con sorprendente frecuencia serán solicitados sus servicios. También invierten relativamente menos en su personal, ya que no hay una curva de aprendizaje aguda para realizar los proyectos, ya que como dijimos, son muy generales. Además siempre habrá efectivo, porque comúnmente los trabajos se pagan en corto tiempo. Claro, si no hay proyectos, habrá problemas. </p>
<p>La mayor desventaja en este tipo de empresas es que tienen un tope claro: la cantidad de horas disponibles. Por ejemplo si se tienen 10 programadores (y claro, a veces habrá diseñadores, en ciertos casos gerentes de proyecto, etc.) y cada programador trabaja 40 horas semanales, es decir 160 horas mensuales, la empresa no puede ofrecer sus servicios por más de 1600 horas mensuales. Y el precio que cobra por hora por 1600 es su tope de ingresos. </p>
<h2>Empresas que desarrollan un producto. </h2>
<p>Estas son las  empresas que toman la determinación desarrollar uno o varios productos y luego se dedicarán a venderlos. La tarea de ventas y mercadeo es parecida a la de un producto normal. Puden tener un equipo de mercadeo y de ventas que sepa poco de software, pero que conozca bien el producto. </p>
<p>La principal ventaja de crear un nuevo producto de software es que el límite está bastante menos definido que en el caso de desarrollos a la medida. Una vez desarrollado el producto las ganancias se multiplicarán en cada venta con costos sorprendentemente bajos. El software, a diferencia de todos los demás productos, no tiene ningún costo por reproducirse. Una vez creado el producto, cada copia vendida tiene un costo de cero. </p>
<p>En ocasiones se requrirán desarrollos a la medida sobre el prodcto base, pero estos desarrollos extras pueden agregarse a nuevas versiones del producto. Además, estos desarrollos podrán ser generados sólo por la empresa, de modo que no hay competencia en cuanto al desarrollo sobre el producto (claro, en casos de productos pequeños y medianos). </p>
<p>El desarrollar un producto lleva tiempo y especialización. El equipo de trabajo ha de ser muy integrado, y agregar nuevos integrantes al equipo es más costoso, porque cada nuevo elmento debe aprender la manera en la que está hecho el producto, su funcionalidad, los estándares de codificación, etc. Nuevas consideraciones aparecen, como la necesidad de afinar estrategias de manejo de versiones, tiempos de trabajo, arquitectura del sistema, manejo del proyecto, y demás tareas que conyevan la creación de un nuevo producto. </p>
<p>Y esto desenboca en el mayor riesgo de este tipo de empresas, especialmente en sus inicios, y este es que el producto no tenga aceptación. Cuando esto sucede los meses de trabajo -que son una inversión absorvida por la empresa- poco valieron. Este tiempo que no generó ingresos es tiempo perdido, aparte del costo perdido en pagar salarios, establecimiento, etc. Por eso para las empresas que desean desarrollar un nuevo producto es clave la decisión sobre qué producto desarrollar. En otro artículo se tratará este caso, porque es realmente importante escoger un buen producto. Por esta razón también es aconsejable sacar la primera versión con pocas características en un lapso de tiempo pequeño, para darse una idea sobre la efectividad en ventas del producto desarrollado. </p>
<p>En algunos casos la idea de productos surge luego de desarrollos a la medida. Tal vez la necesidad de un cliente existe en otros y esto abre la puerta a la posibilidad de desarrollar un producto en base a esa necesidad identificada. Además de que se puede obtener la experiencia en los clientes en los que se desarrolla primero.</p>
<p> </p>
<p>En fín, cada enfoque tiene sus colores y tropezones. La opción de desarrollar un producto puede arrojar ganancias más grandes y crecimientos a escala, pero su puesta en práctica es más complicada tanto operativamente como financieramente, pero si se tiene éxito, las recompensas valen la pena. El camino que se elija tomar determinará las posiblidades, el giro, y el futuro de la empresa.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fempresas-que-hacen-software-a-la-medida-vs-empresas-que-desarrollan-productos&amp;linkname=Empresas%20que%20hacen%20software%20a%20la%20medida%20Vs.%20empresas%20que%20desarrollan%20productos"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/empresas-que-hacen-software-a-la-medida-vs-empresas-que-desarrollan-productos/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prototype Pattern &#8211; Patron Prototipo &#8212; Patrones de diseño</title>
		<link>http://software.guisho.com/prototype-pattern-patron-prototipo-patrones-de-diseno</link>
		<comments>http://software.guisho.com/prototype-pattern-patron-prototipo-patrones-de-diseno#comments</comments>
		<pubDate>Tue, 02 Jun 2009 18:40:00 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[patron prototipo]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[prototipo]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[prototype pattern]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=142</guid>
		<description><![CDATA[Ya casi terminando con los patrones creacionales, vamos a hablar hoy sobre el prototype pattern, o patrón prototipo. Como los demás patrones creacionales, este patrón sustituirá para el cliente la palabra clave new por otra forma de crear objetos. En este caso específico la creación se hará sobre objetos que son complicados de crear, que [...]


Related posts:<ol><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/06/cloning.jpg"><img class="alignleft size-medium wp-image-143" title="cloning" src="http://software.guisho.com/wp-content/uploads/2009/06/cloning-300x224.jpg" alt="cloning" width="300" height="224" /></a>Ya casi terminando con los patrones creacionales, vamos a hablar hoy sobre el prototype pattern, o patrón prototipo. Como los demás patrones creacionales, este patrón sustituirá para el cliente la palabra clave new por otra forma de crear objetos. En este caso específico la creación se hará sobre objetos que son complicados de crear, que para evitar usar new  serán clonados a partir de una instancia ya existente. Afortunadamente crear objetos no crea ningún tipo de reparo moral, porque este patrón de eso se trata: de clonar, de pasar el ADN de un objeto a otro.  Es decir cada instancia del objeto se obtendrá a partir de un prototipo (sí, de ahí el nombre del patrón!). </p>
<p><span id="more-142"></span></p>
<p>Este patrón es facilito, ya lo veremos. En el caso específico de Java ya se tiene mucho camino ganado, porque Java provee la interaz clonable con el propósito de crear clones en mente. Pero vamos a hacer también una implementación sin usar esta interfaz para comprender completamente la idea detrás del prototipo. La primera manera de implementar este patrón en Java es implementando la interfaz Cloneable. Mas abajo veremos otra forma de implementarlo, que es haciéndolo a mano, con una ventaja extra: en vez de crear referencias a los objetos contenidos, podemos crear objetos nuevos, que en muchos cosas nos puede ser de utilidad. Por ahora veamos un un ejemplo sencillo usando cloneable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Copiame <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Cloneable</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Object</span> clone <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
				clone <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">CloneNotSupportedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">return</span> clone<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Expliquemos un poco. Clonable es una interfaz vacía, pero para utilizar super.clone() tenemos que implementar cloneable si no quere mos una CloneNoSupportedException. La segunda cosa a considerar es que clone hace una copia de los valores de los campos de un objeto, no de los objetos a los que apunta. En otras palabras, el objeto clonado  apuntará a los mismos objetos que el objeto antiguo apuntaba. Otra cosa a tomar en cuenta es que clone() devuelve siempre un Object. También notemos que clone es un método protected que puede ser llamado solo por la misma clase o el paquete que la contiene.</p>
<p> </p>
<p> </p>
<p>Entonces, ¿para qué nos sirve clonar objetos? Bueno, nos sirve para copiar objetos que tardan mucho en crear, o que son complejos de crear. Por ejemplo una lista grande que es costoso  en tiempo obtener y que se desea ordenar de dos maneras distintas.</p>
<p> </p>
<p> </p>
<p>De nuevo nos adentraremos con un ejemplo, que sigo pensando es la mejor manera de aprender. Para nuestro ejemplo vamos a hacer una clase Persona y luego llenar la persona con los datos de dos hermanos: Juan y María que serán ingresados a un sistema x.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.prototype</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author guisho.com, luishernan@gmail.com
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Persona <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Cloneable</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nombres<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> appellidos<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nombrePadre<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nombreMadre<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> direccion<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> telCasa<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nacionalidad<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> ciudadEnQueVive<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> nombreMascota<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Persona<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*Setters y geters....*/</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y un cliente que crea la Persona:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Persona juan <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Persona<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setNombres</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Juan José&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setAppellidos</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Pérez Ramirez&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setNombrePadre</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Juan Pérez Martinez&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setNombreMadre</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;María Ramirez&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setDireccion</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;9a. Ave. 43-12 Z.1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setTelCasa</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;34567890&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setNacionalidad</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Guatemalteca&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setCiudadEnQueVive</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Guatemala&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        juan.<span style="color: #006633;">setNombreMascota</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Pepito&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//Hacer algo con Juan, ingresarlo al sistema, etc...</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ingresando al sistema :&quot;</span><span style="color: #339933;">+</span>juan.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        Persona maria <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Persona<span style="color: #009900;">&#41;</span>juan.<span style="color: #006633;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        maria.<span style="color: #006633;">setNombres</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;María Inés&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ingresando al sistema :&quot;</span><span style="color: #339933;">+</span>maria.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//ingresar a Maria al sistema....</span>
&nbsp;
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como vemos, ahora no se tuvieron que ingresar todos los campos de María sino, solo aquellos que la diferenciaban de su hermano Juan. Hay que recordar que si hubiesen objetos en el ejemplo estos se clonan por referencia, es decir las referencias de ambos objetos son las mismas.  Ahora vamos a vamos a implementar la clonación a mano. Le vamos a añadir a Persona este método:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> Persona creaPrototipo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        Persona p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Persona<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setNombres</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombres</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setAppellidos</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">appellidos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setNombrePadre</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombrePadre</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setNombreMadre</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombreMadre</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setDireccion</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">direccion</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setTelCasa</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">telCasa</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setNacionalidad</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nacionalidad</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setCiudadEnQueVive</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ciudadEnQueVive</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p.<span style="color: #006633;">setNombreMascota</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombreMascota</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Creado prototipo de Persona&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> p<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Entonces en el cliente podemos hacer esta llamada</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        Persona maria <span style="color: #339933;">=</span> juan.<span style="color: #006633;">creaPrototipo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Como vemos, el patrón prototipo es sencillo: crear una copia de un objeto para ahorrarnos los pasos de su creación, o para optimizar accesos o procesos que ya se hicieron en un objeto similar y crear una copia del objeto ya con esos datos ingresados. Como siempre les dejo aquí el <a href="http://software.guisho.com/wp-content/uploads/2009/06/patronprototipo.zip">código para que jueguen.</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fprototype-pattern-patron-prototipo-patrones-de-diseno&amp;linkname=Prototype%20Pattern%20%26%238211%3B%20Patron%20Prototipo%20%26%238212%3B%20Patrones%20de%20dise%C3%B1o"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/prototype-pattern-patron-prototipo-patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Haces software, y quieres venderlo&#8230;.aprende marketing!</title>
		<link>http://software.guisho.com/haces-software-y-quieres-venderloaprende-marketing</link>
		<comments>http://software.guisho.com/haces-software-y-quieres-venderloaprende-marketing#comments</comments>
		<pubDate>Mon, 01 Jun 2009 04:31:35 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[El Negocio Del Softare]]></category>
		<category><![CDATA[Una empresa de software]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[negocio del software]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ventas]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=132</guid>
		<description><![CDATA[ 
Si estás pensando en poner, o ya tienes, una empresa de software, tendrás que aprender un poco de marketing, mercadeo y todas esas otras ciencias ocultas que siempre viste de menos y consideras superfluas y no dignas de tu valioso y hermoso tiempo. Pero si quieres que tu empresa salga adelante, has de enamorarte (o [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p> </p>
<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/marketing-strategy-win-new-clients1.jpg"><img class="alignleft size-full wp-image-133" title="marketing-strategy-win-new-clients1" src="http://software.guisho.com/wp-content/uploads/2009/05/marketing-strategy-win-new-clients1.jpg" alt="marketing-strategy-win-new-clients1" width="233" height="299" /></a>Si estás pensando en poner, o ya tienes, una empresa de software, tendrás que aprender un poco de marketing, mercadeo y todas esas otras ciencias ocultas que siempre viste de menos y consideras superfluas y no dignas de tu valioso y hermoso tiempo. Pero si quieres que tu empresa salga adelante, has de enamorarte (o al menos hacer que te gusta) del marketing.<span id="more-132"></span></p>
<p>En estos posts estaré tocando con cierta frecuencia el tema del marketing, porque a nosotros los tecnólogos geeks no nos gusta, no se nos hace necesario y hasta vemos de menos aquellos que lo practican. Pero tienes que tener en mente esto: si quieres hacer una empresa existosa, te conviene saber de marketing. Tu empresa puede no hacer buenos productos y mercadearse bien, y seguirá viva. Pero si hace excelentes productos que nadie conoce (o que a nadie le sirven!) estarás en problemas. Claro si haces malos productos y nadie los conoce ya sabes el destino <img src='http://software.guisho.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>El marketing te servirá tanto como si quieres hacer una empresa de 1000 personas con ventas millonarias al año, como si quieres poner tu pequeño estudio de freelancing en tu hogar y ganar lo suficiente para mantenerte y para tus chicles. Es vital para tu empresa, sea de uno o de mil, que venda. Y si lo que quieres vender es software tienes que aprender a hacerlo. Pronto te darás cuenta que lo más difícil es vender &#8211; y que &#8211; al final de los cantares el mundo del software s un mundo de ventas. </p>
<p>Así que nada de hacerle caras feas al marketing y vete a comprar un par de buenos libros para devorarlos. Aquí iremos también compratiendo experiencias y dándote consejos para que vayas teniendo una guía. </p>
<p>P.D. Acabo de buscar y &#8220;marketing&#8221; es considerado como correcto (aunque anglicismo) por la RAE.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fhaces-software-y-quieres-venderloaprende-marketing&amp;linkname=Haces%20software%2C%20y%20quieres%20venderlo%26%238230%3B.aprende%20marketing%21"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/haces-software-y-quieres-venderloaprende-marketing/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</title>
		<link>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno</link>
		<comments>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno#comments</comments>
		<pubDate>Fri, 29 May 2009 18:27:10 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[builder pattern]]></category>
		<category><![CDATA[constructor encadenado]]></category>
		<category><![CDATA[fluid interface]]></category>
		<category><![CDATA[interfaces fluídas]]></category>
		<category><![CDATA[patron builder]]></category>
		<category><![CDATA[patron constructor]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones creacionales]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=104</guid>
		<description><![CDATA[
El builder pattern, o patrón de construcción, es uno más de los patrones creacionales de diseño. En términos generales un builder esconde los detalles de la creación de un objeto final que se llama producto. Hay varios métodos para lograr esto, y por ello hay varias &#8220;implementaciones&#8221; de este patrón que en nada coinciden , [...]


Related posts:<ol><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-117" title="lego" src="http://software.guisho.com/wp-content/uploads/2009/05/lego.jpg" alt="lego" width="300" height="199" /></p>
<p>El builder pattern, o patrón de construcción, es uno más de los patrones creacionales de diseño. En términos generales un builder esconde los detalles de la creación de un objeto final que se llama producto. Hay varios métodos para lograr esto, y por ello hay varias &#8220;implementaciones&#8221; de este patrón que en nada coinciden , salvo en el nombre. El clásico, usado en el GoF es un poco más complejo del que vamos a ver ahora, pero no se asusten, ya tendremos la oportunidad de aprenderlo. En esta ocasión nos vamos a enfocar en un builder que se llaman interfaces fluídas (fluid interfaces).<span id="more-104"></span></p>
<p>Y seguimos con la política de que la mejor manera de entender, y de aprender, es con un ejemplo. Estuve dándole vueltas a un buen caso para ejemplificar y se me ocurrió este: supongamos que vamos a hacer un programa para una empresa que ofrece servicios de web hosting (alojamiento en web). Esta empresa tiene varios planes que ofrecer: tiene un plan personal, un plan bronce, uno plata, uno oro y finalmente el diamante. El personal ofrece un alojamiento de 10MB, una transferencia mensual de 100MB, una cuenta de correo electrónico y nada más. El bronce ofrece 100MB de alojamiento, 1000MB de transferencia mensual, 10 cuentas de correo electrónico. Así sucesivamente cada plan aumenta las cantidades de alojamiento, transferencia y cuentas de correo. A la cada plan agrega nuevas características. El plata ofrece acceso ssh, y una base de datos; el oro agrega estadísticas de sitio y panel de control. Así se van multiplicando las opciones, y para crear la aplicación definimos nuestro objeto que queda así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.builder</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.math.BigDecimal</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author guisho.com, luishernan@gmail.com
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PaqueteDeHosting <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/*Los siguientes campos son obligatorios siempre*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nombre<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">BigDecimal</span> precioAnual<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> capacidadDeAlmacenamiento<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//en MB</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> transferenciaMensual<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//en MB</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadDireccionesCorreo<span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/*Las siguientes son opcionales, hay planes que no los tienen*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadSitiosPermitidos<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadBaseDeDatos<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> codigoOferta<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> accesoSsh<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> panelDeControl<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> estadisticasDeSitio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> ipPublica<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/* mas constructores */</span>
    <span style="color: #666666; font-style: italic;">/* Setters, getters y demás código....*/</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bien, ahora cada plan tiene una configuración previamente establecida, que el vendedor no arma en el momento, y que preferiblemente no puede cambiar. ¿Cómo hacemos para crear cada objeto? La primera manera que se nos ocurrirá es crear un constructor pada cada caso, manteniendo siempre los valores obligatorios. Tendríamos una colección de constructores como la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #000066; font-weight: bold;">int</span> basesDatos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadBaseDeDatos</span> <span style="color: #339933;">=</span> basesDatos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #003399;">String</span> ipPublica<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipPublica</span> <span style="color: #339933;">=</span> ipPublica<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #003399;">String</span> ipPublica,<span style="color: #000066; font-weight: bold;">int</span> basesDatos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span><span style="color: #339933;">=</span>nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span><span style="color: #339933;">=</span>precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span><span style="color: #339933;">=</span>almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span><span style="color: #339933;">=</span>transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span><span style="color: #339933;">=</span>cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipPublica</span><span style="color: #339933;">=</span>ipPublica<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #339933;">=</span>basesDatos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
....</pre></div></div>

<p>Como vemos solo hicimos un par de combinaciones con la cantidad de bases de datos y la ip pública. Mientras la cantidad de campos opcionales crece, la cantidad de constructores aumenta desmedidamente creando el ambiente ideal para que aparezcan errores.</p>
<p>Otro camino que se puede tomar es el clásico bean: un constructor vacío y setters para cada parámetro que deseamos agregar. Este método tiene un pequeño inconveniente: podemos dejar al objeto en un estado incosistente: podemos ponerle cuántas cuentas de correo pero no ponerle nombre, ni ponerle precio. ¿Qué hacemos entonces? Hacemos un Builder!! El builder se explicará por el solo. Veamos:</p>
<p>En PaqueteDeHosting hacemos un constructor con los campos que siempre van para evitar estados inconsistentes:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y creamos el builder</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.builder</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.math.BigDecimal</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author guisho.com, luishernan@gmail.com
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PaqueteDeHostingBuilder <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span>  PaqueteDeHosting paquete<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precio, <span style="color: #000066; font-weight: bold;">int</span> cantidadAlmacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferenciaMesual, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setNombre</span><span style="color: #009900;">&#40;</span>nombre<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setPrecioAnual</span><span style="color: #009900;">&#40;</span>precio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCapacidadDeAlmacenamiento</span><span style="color: #009900;">&#40;</span>cantidadAlmacenamiento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setTransferenciaMensual</span><span style="color: #009900;">&#40;</span>transferenciaMesual<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCantidadDireccionesCorreo</span><span style="color: #009900;">&#40;</span>cantidadCorreo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder catidadSitiosPermitidos <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> cantidad<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCantidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span>cantidad<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder cantidadBaseDeDatos <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> cantidad<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span>cantidad<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder accessoSsh<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> acceso<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setAccesoSsh</span><span style="color: #009900;">&#40;</span>acceso<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder panelControl <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> panel<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setPanelDeControl</span><span style="color: #009900;">&#40;</span>panel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder codigoOferta<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> codigo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCodigoOferta</span><span style="color: #009900;">&#40;</span>codigo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder ipPublica <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> ip<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setIpPublica</span><span style="color: #009900;">&#40;</span>ip<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Si lo analizamos el builder simplemente envuelve al objeto que creará, con una especie de métodos de acceso (parecido a un JavaBean) pero con la peculiaridad que se devuelve a sí mismo siempre. ¿En qué nos ayuda esto? Miremos el cliente como crea un Paquete ahora:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        PaqueteDeHosting personal <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;personal&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">10</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting bronce <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bronce&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1000</span>,<span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting plata <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plata&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">300</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1000</span>,<span style="color: #cc66cc;">50</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">catidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting oro <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;oro&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">4000</span>,<span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">catidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">ipPublica</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;10.10.10.10&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como vemos esto es mucho más sencillo de leer (aparte que la línea se alarga un poco, podríamos hacer varias líneas), y deja al objeto siempre en un estado consistente. Este método de construcción por medio de llamadas encadenadas se llama interfaces fluídas, y es el punto de inicio para muchos lenguajes como Groovy, que crean construcciones bastantes complejas a partir de Builders sencillos que permiten muchas configuraciones.</p>
<p>De nuevo, este no es el Builder de GoF, que veremos en otra ocasión, pero es otro concepto de Builder. Tiene la ventaja que es fácil de entender y de implementar. Imagino que ya se les ocurrió varias maneras de implementarlo en su código actual, así que manos a la obra y a dejar bonito el código! Finalmente les dejo el <a href="http://software.guisho.com/wp-content/uploads/2009/05/builderpattern-fluidinterfaces.zip">código fuente de los ejemplos aquí.</a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fbuilder-pattern-interfaces-fluidas-patrones-de-diseno&amp;linkname=Builder%20Pattern%2C%20Interfaces%20Fluidas%26%238211%3B%20Patrones%20de%20dise%C3%B1o"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Singleton Pattern &#8212; Patrones de diseño</title>
		<link>http://software.guisho.com/singleton-pattern-patrones-de-diseno</link>
		<comments>http://software.guisho.com/singleton-pattern-patrones-de-diseno#comments</comments>
		<pubDate>Thu, 14 May 2009 05:07:01 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[creacionales]]></category>
		<category><![CDATA[patron singleton]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones creacionales]]></category>
		<category><![CDATA[sigleton]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=101</guid>
		<description><![CDATA[Estamos abordando ahora un tercer patrón creacional, o de creación. El Singleton Pattern, a diferencia de los dos que ya hemos visto y los que veremos, no se encarga de la creación de objetos en sí, sino que se enfoca en la restricción en la creación de un objeto. Este patrón es ampliamente utilizado por [...]


Related posts:<ol><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/singleton.jpg"><img class="alignleft size-medium wp-image-127" title="singleton" src="http://software.guisho.com/wp-content/uploads/2009/05/singleton-300x300.jpg" alt="singleton" width="300" height="300" /></a>Estamos abordando ahora un tercer patrón creacional, o de creación. El Singleton Pattern, a diferencia de los dos que ya hemos visto y los que veremos, no se encarga de la creación de objetos en sí, sino que se enfoca en la restricción en la creación de un objeto. Este patrón es ampliamente utilizado por muchos frameworks, y también es uno de los más fáciles de aprender y utilizar. </p>
<p><span id="more-101"></span>Siempre que se crea un objeto nuevo (en Java con la palabra reservada new) se invoca al constructor del objeto para que cree una instancia. Por lo general los constructores son públicos. El singleton lo que hace es convertir al constructor en privado, de manera que nadie lo pueda instanciar. Entonces, si el constructor es privado, ¿cómo se instancia el objeto? Pues a través de un método público y estático de la clase. En este método se revisa si el el objeto ha sido instanciado antes. Si no ha sido instanciado, llama al constructor y guarda el objeto creado en una variable estática del objeto. Si el objeto ya fue instanciado anteriormente, lo que hace este método es devolver la referencia al estado creado anteriormente. </p>
<p>En los patrones anteriores utilizamos un Traductor. Imaginemos que el traductor carga a memoria no sólo números, pero también diez mil palabras obtenidas a través de un archivo de texto o un web service. Cada vez que este objeto se cree utilizará mucho espacio en memoria. Además, si se usa un web services para cargarlo, cada carga consume muchos recursos de red y tarda mucho en terminarse de construir. </p>
<p>Traductor estará disponible para toda la aplicación, y en cualquier lado que se despliegue un texto será invocado. No tendría mucho sentido construir un Traductor cada vez que lo querramos utilizar. Lo más sano sería utilizar un sólo Traductor para toda la aplicación. ¿Cómo lograrlo? A través de un Singleton. Omitiendo la lógica del objeto, el código que se debería usar quedaría algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Traductor<span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> instanciated<span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> Traductor traductorInstance<span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #008000; font-style: italic; font-weight: bold;">/**
       *Notar que el constructor es privado!
      */</span>
      <span style="color: #000000; font-weight: bold;">private</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//cargar un diccionario a memoria  a través de un WebService.</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Traductor getTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
           <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> Traductor.<span style="color: #006633;">instanciated</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                 Traductor.<span style="color: #006633;">traductorInstance</span><span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                 Traductor.<span style="color: #006633;">instanciated</span><span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
           <span style="color: #009900;">&#125;</span>
          <span style="color: #000000; font-weight: bold;">return</span> Traductor.<span style="color: #006633;">traductorInstance</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> translate<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> toTranslate<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #666666; font-style: italic;">//mucho código bonito va aquí</span>
    <span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>En cualquier lugar de la aplicacion que se quiera utilizar hacer una traducción se hace esto:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Traductor.<span style="color: #006633;">getTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">translate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unaPalabra&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>¿Qué logramos con esto? Que alguien que utilice nuestro código no pueda hacer esto</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Traductor t <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Es un gran beneficio porque podemos controlar mejor, cambiarla en el futuro, optimizarla, a Traductor. Evita malos usos de la clase y se nos asegura que a lo más hay una instancia del objeto en toda la aplicación.</p>
<p>Las cosas no son tan fáciles como parecen. Hay muchas maneras de crear los Singletons. En este ejemplo utilizamos un booleano estático, pero no siempre es necesario, pudimos haber inicializado traductorInstance como null, y en vez de verificar la variable booleana, verificar si la instancia es null o no.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Traductor<span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span>  Traductor traductorInstance<span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
      <span style="color: #008000; font-style: italic; font-weight: bold;">/**
       *Notar que el constructor es privado!
      */</span>
      <span style="color: #000000; font-weight: bold;">private</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//cargar un diccionario a memoria  a través de un WebService.</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Traductor getTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
           <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> Traductor.<span style="color: #006633;">INSTANCE</span><span style="color: #339933;">==</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                 Traductor.<span style="color: #006633;">traductorInstance</span><span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
           <span style="color: #009900;">&#125;</span>
          <span style="color: #000000; font-weight: bold;">return</span> Traductor.<span style="color: #006633;">traductorInstance</span><span style="color: #339933;">;</span>
   	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> translate<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> toTranslate<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #666666; font-style: italic;">//mucho código bonito va aquí</span>
    <span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O, para hacer las cosas más fáciles (que no siempre conviene, jeje) podríamos evitar la evaluación en getTraductor y crear el objeto cuando lo declaramos:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Traductor<span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span>  Traductor traductorInstance<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #008000; font-style: italic; font-weight: bold;">/**
       *Notar que el constructor es privado!
      */</span>
      <span style="color: #000000; font-weight: bold;">private</span> Traductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//cargar un diccionario a memoria  a través de un WebService.</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Traductor getTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
           <span style="color: #000000; font-weight: bold;">return</span> Traductor.<span style="color: #006633;">traductorInstance</span><span style="color: #339933;">;</span>
   	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> translate<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> toTranslate<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #666666; font-style: italic;">//mucho código bonito va aquí</span>
    <span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Fácil ¿no? Mmm, pues se puede complicar. En Java por ejemplo, todavía se podría obtener una copia de traductor así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Traductor t <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Traductor<span style="color: #009900;">&#41;</span>Traductor.<span style="color: #006633;">getTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para evitar esto tendríamos que añadir las siguietnes líneas a nuestra clase Traductor</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> clone<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">CloneNotSupportedException</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">CloneNotSupportedException</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span></pre></div></div>

<p>También alguien podría extender la clase y volver público el constructor. Para evitar esto sería buena idea declarar nuestra clase como final.</p>
<p>Hay que tener <strong>especial cuidado </strong> cuando el Singleton se utiliza en un ambiete multi hilos, porque puede crear problemas si no se implementa de la manera adecuada. En Java es posible que tengamos que meter algún synchronized por ahí para evitar problemas.</p>
<p>Concluyendo, la  idea central del Singleton es esa: asegurar de que exista tan solo una instancia del objeto en toda la aplicación. Hay muchas maneras de implementar un Singleton (aquí solo vimos algunas). Es un patrón muy aplicado en Java, aunque, como todos los patrones, se puede implementar en cualquier lenguaje orientado a objetos.  También se pueden hacer cosas interesantes uniendo el Singleton con otros patrones creacionales (recordemos que el singleton no busca crear, sino que limitar la creación).</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fsingleton-pattern-patrones-de-diseno&amp;linkname=Singleton%20Pattern%20%26%238212%3B%20Patrones%20de%20dise%C3%B1o"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/singleton-pattern-patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Abstract Factory Pattern &#8211; Patrones</title>
		<link>http://software.guisho.com/abstract-factory-pattern-patrones</link>
		<comments>http://software.guisho.com/abstract-factory-pattern-patrones#comments</comments>
		<pubDate>Wed, 06 May 2009 03:53:26 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[abstract factory pattern]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=86</guid>
		<description><![CDATA[Hace una semana hablamos del Factory Pattern, que realmente se llama Factory Method Pattern, porque como vimos se trata de reducir la desición de la creación de una instancia a un método, pero que por gusto mío lo pusimos en una clase Factory con un método abstracto. Ahora vamos a hablar del Abstract Factory Pattern, [...]


Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/factory.jpg"><img class="alignleft size-medium wp-image-124" title="factory" src="http://software.guisho.com/wp-content/uploads/2009/05/factory-199x300.jpg" alt="factory" width="199" height="300" /></a>Hace una semana hablamos del Factory Pattern, que realmente se llama Factory Method Pattern, porque como vimos se trata de reducir la desición de la creación de una instancia a un método, pero que por gusto mío lo pusimos en una clase Factory con un método abstracto. Ahora vamos a hablar del Abstract Factory Pattern, que va un paso más alla: el Abstract Factory Method agrupa varios Factory Methods.</p>
<p>Básicamente lo que hace el este patrón es unir varios Factory Methods, delegando la responsabilidad total sobre qué instancias crear a partir de datos comunes. La semana pasada hicimos un pequeño traductor, que al recibir un número desplegaba su valor en español, inglés o alemán. Para mostrar el concepto del Abstract Factory vamos a extender el ejemplo.<span id="more-86"></span></p>
<p>Primero vamos hacer un sencillo reloj que nos muestra la hora actual. Como sabemos, la hora puede ser desplegada en formato de 24Hrs o puede ser desplegada en formato AM/PM. Recordando que es a manera de ejemplo, vamos a utilizar la clase Date de una manera que no se debe, y probablemente el reloj lo haríamos de una manera más sencilla, pero para nuestro ejemplo queda perfecta su uso. Como en el caso del diccionario, haremos una clase abstracta de Reloj y dos implementaciones para cada una de los formatos, y una clase que contenga el método del Factory Method. La cosa quedaría algo así:</p>
<p>La clase Reloj:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Reloj <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La clase que se da la hora en formato AM/PM:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RelojAmPm <span style="color: #000000; font-weight: bold;">extends</span> Reloj<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> RelojAmPm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Date</span> d <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hora <span style="color: #339933;">=</span> d.<span style="color: #006633;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> minutos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getMinutes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> segundos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getSeconds</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> tr<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>hora<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            tr<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Son las &quot;</span><span style="color: #339933;">+</span>hora<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>minutos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>segundos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; AM&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            tr<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Son las &quot;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>hora<span style="color: #339933;">-</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>minutos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>segundos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; PM&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> tr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La que nos da la hora en formato de 24 horas:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Reloj24Hrs <span style="color: #000000; font-weight: bold;">extends</span> Reloj <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Date</span> d <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hora <span style="color: #339933;">=</span> d.<span style="color: #006633;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> minutos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getMinutes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> segundos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getSeconds</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> tr<span style="color: #339933;">;</span>
        tr <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Son las &quot;</span> <span style="color: #339933;">+</span> hora <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;:&quot;</span> <span style="color: #339933;">+</span> minutos <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;:&quot;</span> <span style="color: #339933;">+</span> segundos <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> tr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nuestra clase que contiene la el método que elije las instancias. A diferencia del post anterior, ahora el parámetro que recibe el método es un entero, que acepta los enteros especificados como constantes estáticas en la clase. Esto se usa mucho para no estar adivinando los paráemetros que acepta el método:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RelojFactory <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> RELOJ_AM_PM<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> RELOJ_24_HRS<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> RelojFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> tipoDeReloj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tipoDeReloj<span style="color: #339933;">==</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Reloj24Hrs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tipoDeReloj<span style="color: #339933;">==</span>RelojFactory.<span style="color: #006633;">RELOJ_AM_PM</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> RelojAmPm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y finalmente la clase cliente, que será la usuario final:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Reloj r <span style="color: #339933;">=</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>r.<span style="color: #006633;">dameLaHora</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Hasta aquí tenemos dos fábricas: una de palabras, y la que acabamos de hacer que nos da la hora. En un proyecto cualquiera se nos pide hacer un sistema que despliegue la hora y los números de la manera en la que se expresan en cada país (una implementación súper elemental de Locale de Java). Vamos con dos ejemplos prácticos. En Estados Unidos se despliegan los números en inglés, y la hora en formato AM/PM; mientras que en Guatemala se dicen los números en español y la hora en formato de 24 Horas.</p>
<p>Ahora vamos a crear una Abstract Factory, que le pondremos Locale.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractLocaleFactory <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> US<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ESTADOS_UNIDOS&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> GT<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;GUATEMALA&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003399;">String</span> pais<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getPais<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setPais<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> pais<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span> <span style="color: #339933;">=</span> pais<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como ven esta fabrica tiene un par de métodos que devuelven un Reloj y un Traductor. Noten que Reloj y Traductor son a su vez clases abstractas.</p>
<p>Ahora implementamos nuestra clase LocaleGuatemalaFactory, que va así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LocaleGuatemalaFactory <span style="color: #000000; font-weight: bold;">extends</span> AbstractLocaleFactory<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">GT</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> TraductorFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;espanol&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y la respectiva para Estados Unidos:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LocaleEstadosUnidosFactory <span style="color: #000000; font-weight: bold;">extends</span> AbstractLocaleFactory<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> LocaleEstadosUnidosFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">=</span>AbstractLocaleFactory.<span style="color: #006633;">US</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> TraductorFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ingles&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_AM_PM</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ahora en el cliente, si queremos las cosas como se verían en Guatemala, simplemente hacemos esto.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        Reloj reloj <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        Traductor traductor <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        reloj <span style="color: #339933;">=</span> localeFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        traductor <span style="color: #339933;">=</span> localeFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;1=&quot;</span><span style="color: #339933;">+</span>traductor.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>reloj.<span style="color: #006633;">dameLaHora</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>El resultado de correr el codigo anterior es:<br />
<strong><br />
1=uno<br />
Son las 21:50:17<br />
</strong></p>
<p>Ahora si cambiamos la linea</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por esta</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleEstadosUnidosFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tendremos como resultado:<br />
<strong><br />
1=one<br />
9:52:56 PM<br />
</strong></p>
<p>Aquí es un ejemplo sencillo. Pero imaginen quedemos hacer un Locale para cada país, y en el locale tener más cosas como: la nomenclatura de moneda, el sistema de numeración, el manejo de fechas, kilómetros o millas, etc. Con el Abstract Factory Pattern es muy sencillo agregar cada nuevo pais, o cada nueva característica del Locale. Pero sobre todo el código es MUY legible y FACILMENTE extensible. Alguien que nunca ha visto estas piezas de código puede entender como hacer un nuevo país.</p>
<p>Entonces, el Abstract Factory Pattern puede ayudarnos mucho en casos donde hemos de manejar familias de objetos. Al inicio no siempre es obvia su implementación, pero siempre está el recurso de del refactoring, en el cual salen nuevas maneras sencillas de hacer las cosas. Este, como muchos patrones, requieren escribir un poco más de código al principio, pero nos reducen el esfuerzo a largo plazo porque hay menos código repetido.</p>
<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/abstractfactory.zip">Aquí el código</a> de este patrón.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fabstract-factory-pattern-patrones&amp;linkname=Abstract%20Factory%20Pattern%20%26%238211%3B%20Patrones"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/abstract-factory-pattern-patrones/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Factory Pattern &#8211; Patrones</title>
		<link>http://software.guisho.com/patrones-de-diseno-factory-pattern</link>
		<comments>http://software.guisho.com/patrones-de-diseno-factory-pattern#comments</comments>
		<pubDate>Tue, 28 Apr 2009 22:57:49 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[factory pattern]]></category>
		<category><![CDATA[patrón de fábrica]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones creacionales]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=55</guid>
		<description><![CDATA[Los patrones creacionales (creational patterns) son aquellos que tienen que ver con la creación (duh!) de objetos. La razón de ser de estos patrones es para facilitar, ordenar, o ayudar en la creación de objetos. Dependiendo del lenguage de programación que estemos utilizando, generalmente crearemos un objeto así: Objeto o = new Objeto(). Pues bueno, [...]


Related posts:<ol><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>Los patrones creacionales (creational patterns) son aquellos que tienen que ver con la creación (duh!) de objetos. La razón de ser de estos patrones es para facilitar, ordenar, o ayudar en la creación de objetos. Dependiendo del lenguage de programación que estemos utilizando, generalmente crearemos un objeto así: Objeto o = new Objeto(). Pues bueno, en los patrones creacionales las cosas cambian un poquito, y probablemente ahora crearemos un objeto así Objeto o = ObjectoFactory.getInstance(&#8220;x&#8221;);, o algo parecido.</p>
<p> </p>
<p>Hoy hablaremos del más famoso de los patrones de creación: en Factory Pattern (Patrón de fábrica). Utilizaremos los nombres ingleses porque creo que son más claros que las traducciones que se podrían hacer. Además, en software de todos lados, es más estandar utilizar el inglés en ciertas nomenclaturas para facilitar que otros lean nuestro código. Buhh, alguien alega por ahí, pero reconzcámoslo: programamos en inglés. </p>
<p><span id="more-55"></span></p>
<p> </p>
<p>Como todo se entiende mejor con un ejemplo -al menos eso creo yo-, comenzaremos con uno. Supongamos se nos encarga crear un traductor que devuelva los números del cero al diez en tres idiomas: inglés, español, y alemán. Existen muchísimas maneras de hacer esto. Al final, se desea un método que reciba un entero entre 0 y 10 y que devuelva una cadena con el nombre de dicho número en el idioma que se esté trabajando. </p>
<p> </p>
<p>Una manera de entrarle al problema podría ser algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">public</span> MainClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> traducirNumero<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> idioma, <span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;español&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		  <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;uno&quot;</span><span style="color: #339933;">;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;dos&quot;</span><span style="color: #339933;">;</span>
		    ....
		   <span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;english&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		    <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;one&quot;</span><span style="color: #339933;">;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;two&quot;</span><span style="color: #339933;">;</span>
		    ....
		    <span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> 
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;deutsch&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		    <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;eins&quot;</span><span style="color: #339933;">;</span>
		     <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;zwei&quot;</span><span style="color: #339933;">;</span>
		    ....
		    <span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//traducirNumero</span>
       
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
MainClient mc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MainClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>mc.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;espanol&quot;</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//de la clase</span></pre></div></div>

<p> El resultado del código anterior, como ya sabrán, es <strong>uno.</strong></p>
<p>Esta solución parece funcionar, y de hecho lo hace. Pero imaginemos que ahora nos dicen que desean la traducción de todos los números? Sin duda el código comenzará a crecer. Y claro, ahora tendremos que agregar código de lógica para cada idioma para escribir números como 752, 1233, etc. </p>
<p>Como nos gusta hacer gala de nuestro enfoque a objetos, los primero que se nos ocurre es una herencia. Definiremos una clase abstracta Traductor, y para cada idioma haremos una subclase de Traductor.</p>
<p> </p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Traductor<span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #003399;">String</span> traducirNumero<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y ahora comienza la magia a aparecer. Vamos a crear una clase especializada para diccionario, que se encargará de traducir los números. Tendremos una clase especializada para traducir los números al español, que iría algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TraductorEspanol <span style="color: #000000; font-weight: bold;">extends</span> Traductor <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> TraductorEspanol<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       ...
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> traducirNumero<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       	   <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;uno&quot;</span><span style="color: #339933;">;</span>
       	   <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;dos&quot;</span><span style="color: #339933;">;</span>
       	   ...
       <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>	
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La clase para el inglés iría</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TraductorIngles <span style="color: #000000; font-weight: bold;">extends</span> Traductor <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> TraductorIngles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       ...
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> traducirNumero<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       	   <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;one&quot;</span><span style="color: #339933;">;</span>
       	   <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;two&quot;</span><span style="color: #339933;">;</span>
       	   ...
       <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>	
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y la del alemán no la ponemos, porque ya captaron la idea. Ahora, en el momento de querer utilizar un diccionario, se llamaría algo así</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Traductor t <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorEspanol<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
t.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Entonces, la clase MainClient cambiaría un poco y quedaría así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span>  traducirNumero<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		Traductor traductor <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;español&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorEspanol<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ingles&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorIngles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> 
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;aleman&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorAleman<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">String</span> toReturn traductor.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span>numero<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">return</span> toReturn<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//traducirNumero</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          MainClient mc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MainClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>mc.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;espanol&quot;</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//de la clase</span></pre></div></div>

<p>Qué hemos ganado? Primero, nuestro código es mucho más legible. Segundo es bastante más escalable. Podemos agregar el traductor para el francés muy fácilmente. Tercero hemos escondido la manera en la que traducimos a Tradúceme. Por ejemplo, puede ser que las traducciones a chino las vayamos a traer a un web Service. En ese caso TraductorChino se encargaría de hacer todo el ajetreo de conectarse a internet y buscar el web services, pero los demás ni se enteran.</p>
<p>Pero el Factory Pattern no ha aperecido, Es tiempo de irlo a llamar. Bueno, Traduceme está haciendo algo que no le compete: está eligiendo la instancia de Traductor que quiere usar. Imaginen que se usa el traductor en 100 lugares,  entonces en cien lugares se tiene que buscar qué clase de Traductor vamos a instanciar. El patrón de fábrica -factory pattern- nos esconde esa lógica. Vamos a agregar ahora nuestra fábrica de traductores.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TraductorFactory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> TraductorFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
     <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> numero<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		Traductor traductor <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma<span style="color: #339933;">==</span><span style="color: #0000ff;">&quot;español&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorEspanol<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma<span style="color: #339933;">==</span><span style="color: #0000ff;">&quot;english&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorIngles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> 
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idioma<span style="color: #339933;">==</span><span style="color: #0000ff;">&quot;deutsch&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			traductor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TraductorAleman<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> traductor<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//de la clase</span></pre></div></div>

<p>¿Qué hace TraductorFactory? Simplemente elige, en base a los argumentos dados &#8211; en este caso el idioma- qué clase de traductor se instanciará. Traduceme de nuevo cambia y quedaría así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
     <span style="color: #003399;">String</span> idioma<span style="color: #339933;">;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span>Strin <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		Traductor traductor <span style="color: #339933;">=</span> TraductorFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;espanol&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> traductor.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//main</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//de la clase</span></pre></div></div>

<p>MainClient se ha visto dramáticamente reducido, y su código es muy fácil de leer. Quien quiera usar un traductor simplemente hará llamar a Traduceme. Traduceme sabe el idioma que eligieron, pero no sabe que subclase de Traductor instanciar, pero sabiendo el idioma TraductorFactory sabe exáctamente qué instancia de Traductor crear. Si la aplicación desea cambiar de idioma simplemente le envía otro parámetro a Traduceme y listo. También agregar idiomas es más manejable que antes. </p>
<p>El Factory Pattern esconde al usuario final dle código la desición de qué sublclase instanciar, y promueve el encapsulamiento de las partes más variables del sistema. En términos generales, una fábrica abstracta consiste de las siguientes partes:</p>
<ul>
<li>Un cliente, que es el que llama a la fábrica (en nuestro caso MainClient).</li>
<li>Una fábrica, que decidé la clase a instanciar (TraductorFactory).</li>
<li>Un prodicto, lo que la fábrica devuelve (para nosotros las instancias de Traductor).</li>
</ul>
<p> </p>
<p>Pueden bajar los fuentes de este <a href="http://software.guisho.com/wp-content/uploads/2009/04/factorypattern.zip">ejemplo aqui</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fpatrones-de-diseno-factory-pattern&amp;linkname=Factory%20Pattern%20%26%238211%3B%20Patrones"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li><li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/patrones-de-diseno-factory-pattern/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Oracle compra Sun&#8230;</title>
		<link>http://software.guisho.com/oracle-compra-sun</link>
		<comments>http://software.guisho.com/oracle-compra-sun#comments</comments>
		<pubDate>Tue, 21 Apr 2009 22:27:33 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=41</guid>
		<description><![CDATA[Estamos en abril, pero la noticia del año en  en el mundo tecnológico  acaba de suceder: Oracle comró Sun. El precio por acción fue de $9.50, totalizando la pequeña cifra de 7.2 millones de dólares. Muchas cosas han aparecido y mucho se ha comentado en blogs, foros y cículos tecnológicos en general. Para muchos, como [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/04/oracle_sun.jpg"><img class="alignleft size-medium wp-image-121" title="oracle_sun" src="http://software.guisho.com/wp-content/uploads/2009/04/oracle_sun-300x222.jpg" alt="oracle_sun" width="300" height="222" /></a>Estamos en abril, pero la noticia del año en  en el mundo tecnológico  acaba de suceder: Oracle comró Sun. El precio por acción fue de $9.50, totalizando la pequeña cifra de 7.2 millones de dólares. Muchas cosas han aparecido y mucho se ha comentado en blogs, foros y cículos tecnológicos en general. Para muchos, como yo, que desarrollamos mucho en Java la pregunta obligada es ¿qué va a pasar con Java? Pero lejos de ser esta la única pregunta a responder, hay una lista que surge por ahí.</p>
<p><span id="more-41"></span></p>
<ul>
<li>¿Qué va a pasar con MySQL? El negocio principal de Oracle han sido las bases de datos, y lo seguirá siendo. MySQL probablemente ha sido su mayor competidor. ¿Lo dejarán vivir? Yo creo que sí, que volverán a MySQL parte de su negocio. </li>
<li>¿Qué va a pasar con Netbeans? De cuando en vez visité el sitio de JDeveloper, lo bajaba y lo probaba. Sin duda un IDE bonito y completo. Lo que nunca encontré es alguien que lo usara y siempre me causó duda el que Oracle lo siguiera desarrollando. ¿Van a unir NetBeans y JDeveloper? ¿Adiós Netbeans? ¿Seguirán caminos separados?</li>
<li>¿Qué va a pasar con Solaris? Creo que vamos a comenzar a escuchar más de Solaris. Aparecerán versiones de Oracle (y MySQL) áltamente optimizadas para Solaris y cosas parecidas.</li>
<li>¿Qué va a pasar con OpenOffice? Mmmm, no sé. ¿Le interesará a Oracle?</li>
<li>¿Que pasará con VirtualBox?</li>
<li>¿Que pasará con Glassfish y parecidos? Es probable que Oracle intente unificar todo el middleware en el suyo propio. JBoss debe estar ya craneando qué camino tomará para que no se lo tomen. </li>
</ul>
<p> </p>
<p>Un tema que ha sucitado mucha incógnita es ¿qué pasará con el hardware de Sun? ¿Se dedicará Oracle a vender servers? Oracle ha tenido mucho acercamiento con Dell y especialmente HP para vender su base de datos en servidores de dichas compañías. ¿Querrán hacer compromisos éstas con su nuevo competidor?</p>
<p> </p>
<p>En fin, la lista de preguntas es larguísima. Desde las certificaciones hasta el JCP (Java Community Process). Sólo el tiempo nos dirá. IBM hizo una propuesta de comprar son a inicios de mes &#8230; ¿se estarán mordiendo los dientes? Lo que sí sé, es que tendremos Java por mucho tiempo más.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Foracle-compra-sun&amp;linkname=Oracle%20compra%20Sun%26%238230%3B"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/oracle-compra-sun/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Patrones de Diseño</title>
		<link>http://software.guisho.com/patrones-de-diseno</link>
		<comments>http://software.guisho.com/patrones-de-diseno#comments</comments>
		<pubDate>Tue, 21 Apr 2009 22:07:24 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[patrones]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=38</guid>
		<description><![CDATA[Patrones de Diseño (Design Patterns)
A partir de ahora comenzaremos todos los martes con un nuevo patrón de diseño. ¿Qué son los patrones de diseño? Bueno, durante el tiempo que el paradigma de programación orientado a objetos ha estado por ahí, se han aprendido muchas cosas. Muchas de las lecciones aprendidas se han tratado de conceptualizar. [...]


Related posts:<ol><li><a href='http://software.guisho.com/patrones-estructurales-structural-patterns' rel='bookmark' title='Permanent Link: Patrones estructurales (structural patterns)'>Patrones estructurales (structural patterns)</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.guisho.com/wp-content/uploads/2009/04/image9294.jpg"><img class="alignleft size-medium wp-image-130" title="image9294" src="http://software.guisho.com/wp-content/uploads/2009/04/image9294-300x292.jpg" alt="image9294" width="300" height="292" /></a>Patrones de Diseño (Design Patterns)</p>
<p>A partir de ahora comenzaremos todos los martes con un nuevo patrón de diseño. ¿Qué son los patrones de diseño? Bueno, durante el tiempo que el paradigma de programación orientado a objetos ha estado por ahí, se han aprendido muchas cosas. Muchas de las lecciones aprendidas se han tratado de conceptualizar. El primer esfuerzo se le debe a la conocida como Gang Of Four (GoF), quienes fueron los primeros en acuñar el término. </p>
<p><span id="more-38"></span></p>
<p>Los patrones de diseño son un conjunto de estrategias, o buenas prácticas, que pueden facilitar el trabajo en muchas situaciones a la hora de realizar una aplicación orientada a objetos (según la RAE utilizo de mala manera el término &#8220;aplicación&#8221;). Los patrones de diseño son relativamente fáciles de comprender, no son nada del otro mundo. Lo que a veces se hace complejo es utilizarlos. Por ello hay que conocerlos bien, especialmente los más importantes, porque realmente facilitan el trabajo, y sobre todo, hacen el código más legible. </p>
<p>Los patrones de diseño son independientes del lenguaje en el que utilicen (siempre y cuando el lenguaje sea orientado a objetos!). Generalmente se presentan como diagramas de UML. Una lista completa la pueden encontrar en <a href="http://es.wikipedia.org/wiki/Patrón_de_diseño">wikipedia</a>. </p>
<p>Según su enfoque los patrones de diseño se agrupan en:</p>
<ul>
<li>Patrones de creación (o creacionales). </li>
<li>Patrones estructurales. </li>
<li>Patrones de  comportamiento.</li>
<li>Patrones de sistema. </li>
</ul>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fpatrones-de-diseno&amp;linkname=Patrones%20de%20Dise%C3%B1o"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>Related posts:<ol><li><a href='http://software.guisho.com/patrones-estructurales-structural-patterns' rel='bookmark' title='Permanent Link: Patrones estructurales (structural patterns)'>Patrones estructurales (structural patterns)</a></li><li><a href='http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno' rel='bookmark' title='Permanent Link: Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño'>Patron Adaptador &#8211; Pattern Adapter &#8211; Patrones de diseño</a></li><li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Que quiero de mi capa de presentación?</title>
		<link>http://software.guisho.com/que-quiero-de-mi-capa-de-presentacion</link>
		<comments>http://software.guisho.com/que-quiero-de-mi-capa-de-presentacion#comments</comments>
		<pubDate>Tue, 16 Dec 2008 06:52:20 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Comentarios sobre...]]></category>
		<category><![CDATA[Discutiendo tecnologias]]></category>
		<category><![CDATA[gui]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=29</guid>
		<description><![CDATA[En mi post anterior comenté la necesidad de buscar y aprender una nueva tencología de presentación. Como lo comenté en otras ocasiones, esta tecnología ha de ser web. Ya comencé mi búsqueda y se puede decir que ya he decidido (pronto lo sabrán).
Algunas características importantes que pido de la tecnología de presentación:

Java. Por ahora me [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>En mi post anterior comenté la necesidad de buscar y aprender una nueva tencología de presentación. Como lo comenté en otras ocasiones, esta tecnología ha de ser web. Ya comencé mi búsqueda y se puede decir que ya he decidido (pronto lo sabrán).</p>
<p>Algunas características importantes que pido de la tecnología de presentación:</p>
<ul>
<li>Java. Por ahora me quedo con Java, con sus pros y sus contras.</li>
<li>Web.</li>
<li>Open, libre, gratis.</li>
<li>Que las cosas se vean bonitas, out-of-the-box. No soy bueno con el diseño gráfico, y por ahora no tengo interés en enfocarme en él. Por ello es importante que la tecnología que escoja haga cosas fancy que se vean bonitas.</li>
<li>Que sea sencillo generar código con él.</li>
<li>La curva de aprendizaje no ha de ser muy elevada.</li>
<li>Decente integración con Netbeans y/o eclipse.<span id="more-29"></span></li>
</ul>
<p>Ahora, vamos con cosas puntuales.</p>
<ul>
<li>Binding inteligente. Mejor si la unión entre el GUI y el resto pueda hacerse con Beans.</li>
<li>Tablas inteligentes. TableModel, o equivalente que permita hacer pagineos y búsquedas sobre las columnas. Las tablas son muy importantes para mí.</li>
<li>Ajax&#8230;.</li>
<li>Templates o skins ya definidos, y una manera de personalizar un poco la presentación final.</li>
<li>La menor cantidad de código goma o de plomero. No soy amigo de XML, pero tampoco enemigo: si se usa de manera inteligente puede ayudar mucho, pero hay frameworks que simplemente se pasan con sus implementaciones en xml.</li>
<li>Documentación, ejemplos, etc.</li>
<li>Una comunidad grande. Este es uno de los puntos de mayor peso a mi criterio. Una comunidad de mayor tamaño permite corrección rápida de errores, foros, comentarios, etc.</li>
<li>Algún soporte comercial, o el patrocinio de una(s) de las grandes empresas de software.</li>
<li>Una expectativa larga de vida. Importante también. La tecnología que escoja será mi caballo de batalla por los siguientes años. Al menos espero que así sea.</li>
<li>Cantidad de componentes o widgets. Yo no me voy a poner a diseñar calendarios en js o comboboxes que tengan autocomplete.</li>
<li>Quiero escribir las cosas una vez. Si el framework me deja &#8220;deployar&#8221; mis aplicaciones en html, flash, mobile, desktop y demás mejor.</li>
</ul>
<p>Aparte de las mencionadas hay un &#8220;me gusta&#8221; que una nueva tecnología debe tener. Ese presentimiento interno de que mi relación con la tecnología a escoger será buena.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fque-quiero-de-mi-capa-de-presentacion&amp;linkname=Que%20quiero%20de%20mi%20capa%20de%20presentaci%C3%B3n%3F"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/que-quiero-de-mi-capa-de-presentacion/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Buscando gui</title>
		<link>http://software.guisho.com/buscando-gui</link>
		<comments>http://software.guisho.com/buscando-gui#comments</comments>
		<pubDate>Tue, 16 Dec 2008 06:40:06 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Comentarios sobre...]]></category>
		<category><![CDATA[Discutiendo tecnologias]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[presentation layer]]></category>
		<category><![CDATA[zk]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=26</guid>
		<description><![CDATA[Hace unas semanas comenté sobre las diferencias entre un ambiente de escritorio y un ambiente web. No me costó mucho comprender que debo comenzar con un ambiente web: lo conozco bien, tengo experiencia en él y manejo bien los conceptos y las tecnologías.
Por mucho tiempo mi plataforma de trabajo se basaba en hibernate, para la [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Hace unas semanas comenté sobre las diferencias entre un ambiente de escritorio y un ambiente web. No me costó mucho comprender que debo comenzar con un ambiente web: lo conozco bien, tengo experiencia en él y manejo bien los conceptos y las tecnologías.<span id="more-26"></span></p>
<p>Por mucho tiempo mi plataforma de trabajo se basaba en hibernate, para la persistencia de datos, jsf para la presentación, más específicamente richfaces, junit para los tests. Simple pero funcional. En su momento tuve la disyuntiva richfaces-icefaces, pero decidí irme por richfaces porque me gustó más y por el hecho de que JBoss lo soportaba. Estaba comenzando con SEAM cuando tuve que hacer un deploy de un proyecto con richfaces en un weblogic 8 que costó muchísimo, lo que me hizo quererme hacer más independiente del servidor en el que instalo: que corra en tomcat.</p>
<p>Bueno, hoy me entero que jboss comenzó´a pasar su middleware a GWT. En pocas palabras me dijeron que abandonarán eventualmente el proyecto richfaces. Por ahora richfaces me funcionó bien, salvo algunos problemas de compatibilidad de exploradores. Pero adquirí mucho conocimiento al respecto y las cosas funcionaban como quería.</p>
<p>Ahora, lo más sabio es buscar y casarme con una nueva tecnología lo más pronto posible. Lo que me abruma es la cantidad de propuestas que existen. Los llamados RIAs ahora aparecen por todos lados. Cada framework con enfoques muy diferentes y propuestas más diferentes. Pero hay que elegir uno.</p>
<p>Hace unas semanas hice un poco de investigación. Al final creo que los competidores finales son:</p>
<ul>
<li>GWT.</li>
<li>ZK.</li>
<li>Echo</li>
<li>OpenLaszlo.</li>
<li>Flex.</li>
<li>Appcelerator.</li>
<li>AdobeAir</li>
<li>JavaFx</li>
<li>Wicket</li>
<li>SmartClient</li>
<li>SpringMVC</li>
<li>OpenXava</li>
<li>ItMill</li>
<li>Rialto</li>
</ul>
<p>Estas han sido mis opciones finales, sin embargo la oferta es considerablemente más amplia. Una búsqueda en google o en wikipedia les puede dar más luces. De todos estos frameworks algunos tienen un enfoque más geek, otro más &#8220;javero&#8221;, otros mas xml, otros más swing, etc. Lo bueno es que hay mucho de donde elegir. Lo malo es, irónico, que hay mucho que elgir.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fbuscando-gui&amp;linkname=Buscando%20gui"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/buscando-gui/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comenzando una empresa de software</title>
		<link>http://software.guisho.com/comenzando-una-empresa-de-software</link>
		<comments>http://software.guisho.com/comenzando-una-empresa-de-software#comments</comments>
		<pubDate>Mon, 08 Dec 2008 17:34:34 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Una empresa de software]]></category>
		<category><![CDATA[empresa de software]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=21</guid>
		<description><![CDATA[Una de las razones por las que nació este blog es para documentar mi experiencia construyendo una nueva empresa de software y los proyectos nuevos que vayan surgiendo. Uno de los talones de Aquiles del mundo del software es la incapacidad de almacenar conocimiento, la constante invención de agua azucarada a la que todos los [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Una de las razones por las que nació este blog es para documentar mi experiencia construyendo una nueva empresa de software y los proyectos nuevos que vayan surgiendo. Uno de los talones de Aquiles del mundo del software es la incapacidad de almacenar conocimiento, la constante invención de agua azucarada a la que todos los que nos movemos en esta bosque constantemente nos sometemos.<span id="more-21"></span></p>
<p>Un buen comienzo es ser sincero: ¿Para qué existe una empresa de software? Como cualquier empresa, la primera razón es: hacer dinero. Creo que cualquier empresa que olvide ese principio llegará a tener problemas de subsistencia. No es ser materialista, ni mucho menos, pero al final de los cantares, <a href="http://es.wikipedia.org/wiki/Causación">o como la llamaría Aristóteles</a>, la causa final de una empresa de software es hacer dinero.  Y, siguiendo con Aristóteles, la causa material sería el software.</p>
<p>Un libro que recomiendo es On The Business of Software de Erick Sink. Muchas de las ideas que presentaré vienen del libro, que también tendrá su post especial&#8230;.cuando tenga tiempo.</p>
<p>Pero siguiendo con el punto. Así como un martillo existe para martillar, una bicicleta para moverse, una guitarra para tocarla, del mismo modo una empresa existe para hacer dinero. Entonces una empresa de software existe para hacer dinero a través del software que hace.</p>
<p>Tipos o divisiones en las empresas de software hay muchos. Hay empresas que se dedican a hacer sistemas operativos, otras a hacer bases de datos, otras a hacer ERPs, otras para hacer páginas web, otras para integrar distintos sistemas, otras para software bancario, otras de telecomunicaciones, otras para restaurantes, otras hacen software a la medida y un gran etc.</p>
<p>Resumiendo, una empresa de software es una organización dedicada a hacer dinero a través de software. El siguiente punto que se debe definir es ¿qué tipo de software hará la compañía?</p>
<p>En el blog hablaré de mi proyecto, con las restricciones y oportunidades que tengo (el famoso FODA). ¿Haciendo qué tipo de software podré hacer negocio? Para ser realistas por el momento han de desecharse las &#8220;grandes ligas&#8221;. Es irreal suponer, diseñar y demás, una empresa que se dedique a hacer sistemas operativos, o una competencia a MS Office, a SAP, a Oracle o alguno parecido. No digo que no se pueda, lo que digo es que una empresa pequeña NO debe empezar por ahí.</p>
<p>¿Entonces en donde empezar? Bueno, hay nichos, muchos nichos. Hay que elegir un nicho que sea lo suficientemente pequeño que no interese a los grandes, pero que sea lo suficientemente grande para crear ganancias. Creo que una empresa pequeña será generalmente una evolución de consultorías pequeñas o medianas de software hecho a la medida. Este creo que es un buen punto de partida. Por ello hay que elegir cuidadosamente los proyectos en los que un consultor que desea crear una empresa de software se mete.</p>
<p>A la fecha no sé en que nicho de mercado deseo meterme, pero ya les estaré comunicando cuál. También creo que es importante definir un proyecto e intentar separarse un poco del software a la medida ¿por qué? Porque el retorno de un producto que se vende muchas veces es muchas veces mayor que estar haciendo software a la medida.</p>
<p>En conclusión: una empresa de software pequeña es una organización que se dedica a ganar dinero a través de pequeños proyectos de software, consolidando uno o varios productos de los que puede obtener ganancias en un mercado en el que puede competir.</p>
<p>Claro, esto es una simplificación. Una empresa de software, como cualquier otra empresa, tiene mucho conocimiento, muchos trucos, mucha experiencia que debe adquirir y cultivar. No es sencillo funda una empresa próspera de software: hay muchos riesgos que hay que saber identificar y manejar. Hay metodologías técnicas y administrativas que se tienen que adquirir y refinar. El software es una ciencia-arte y para que una empresa que hace algo así es necesario que se componga de artistas-científicos que la hagan funcionar.</p>
<p><small><strong><br />
Luis H. Fernandez<br />
luishernan@gmail.com<br />
</strong></small></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fcomenzando-una-empresa-de-software&amp;linkname=Comenzando%20una%20empresa%20de%20software"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/comenzando-una-empresa-de-software/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Calidad del software</title>
		<link>http://software.guisho.com/calidad-del-software</link>
		<comments>http://software.guisho.com/calidad-del-software#comments</comments>
		<pubDate>Sun, 30 Nov 2008 00:15:27 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[calidad]]></category>
		<category><![CDATA[calidad del software]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=16</guid>
		<description><![CDATA[Calidad en el software.
El término calidad siempre me ha parecido ambiguo. ¿Que hace que un bien o servicio &#8220;posea&#8221; calidad? No sé. Hay procesos de calidad, chequeos de calidad, y mil cosas con calidad, pero nadie entiende a ciencia cierta qué es calidad, aunque todos comprenden el término. Aunque para algunos es aquel software que [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Calidad en el software.</p>
<p>El término calidad siempre me ha parecido ambiguo. ¿Que hace que un bien o servicio &#8220;posea&#8221; calidad? No sé. Hay procesos de calidad, chequeos de calidad, y mil cosas con calidad, pero nadie entiende a ciencia cierta qué es calidad, aunque todos comprenden el término. Aunque para algunos es aquel software que no tiene bugs, para otros el que satisface al cliente, para otros es el que optimiza recursos, para otros el que se mira bonito, etc.<span id="more-16"></span></p>
<p>Cuando el término entra al contexto del software, la cosa se pone peor. ¿Qué hace que un software sea uno de calidad o no? Claro, debido a lo ambiguo del término, la discusión en este tema no tendrá fin.</p>
<p>Con todo, lo que hacemos es software, y nos gustaría hacer siempre software de calidad. Para poder etiquetar a un software como uno de calidad, debemos definir algunos atributos para poder poner el software en evaluación. Estos atributos, y sus prioridades, cambian cuando cambia el contexto de software: un sistema para hospitales se juzga de una manera distinta a una página web.</p>
<p>En FFSE R. Glass propone siete atributos del software que le confieren lo que llamamos calidad:<br />
+Portabilidad: la portabilidad implica que un programa puede correr en distintas plataformas, no sólo de sistemas operativos sino diferentes versiones, diferentes ambientes y esquemas.<br />
+Fiabilidad o confiabilidad: el software hace lo que debería hacer, y no &#8220;truena&#8221;.<br />
+Eficiencia: que tanto recursos economiza en tiempo y espacio el software.<br />
+Facilidad de uso: es fácil de usar?<br />
+Evaluable: Es sencillo de examinar? Se le pueden correr fácilmente unit tests?<br />
+Leíble: Es el código expresivo y fácil de comprender?<br />
+Mofificable: Qué tan sencillo es modificar el software.<br />
+Escalibilidad: pueden agregarse funciones de manera rápida y consistente?</p>
<p>Buscando en internet, encontré otros atributos que vale la pena mencionar:</p>
<p>+Compatibilidad: es el software amigable con otros sistemas?<br />
+Seguridad: es el software seguro contra ataques externos?</p>
<p>Todos concordarán que los atributos anteriores son buenos parámetros para medir la calidad de un producto de software. Sin embargo el orden de estos productos varían de proyecto a proyecto. Un proyecto que maneja información confidencial puede que tenga la seguridad muy alta, una página de internet tendrá muy alta la facilidad de uso, un software bancario tomará más en cuenta la fiabilidad que la portabilidad.</p>
<p><strong>El usuario y el código</strong></p>
<p>Al usuario final le viene del norte en qué tecnología corre un programa, o que metodología de desarrollo se utilizó para su creación. Poco le importa si se utilizó un lenguaje de cuarta generación o assembler. El usuario toma por sentado ciertos estándares y cierta funcionalidad. Por ejemplo un usuario espera siempre que en el lugar que aparezca un disquete se grabe su trabajo. Si esto no funciona bien, el usuario tendrá una muy mala percepción del software, y por tanto el software no tendrá mucha calidad.</p>
<p>El otro lado de la moneda es la calidad del código. ¿Es sencillo de encontrar errores? ¿Hay un buen uso del modelo de programación? ¿Se optimiza el uso del hardware? Aquí cada quien tiene un criterio diferente, hay filosofías, metodologías, paradigmas y demás.</p>
<p>Glass expone algo que me llamó mucho la atención: la satisfacción del cliente no es lo mismo que calidad de software. Entre los elementos que evalúa el cliente están cosas como el precio del producto, el diseño, el tiempo de entrega, el soporte y otros. Un mal software puede tener una alta satisfacción (aunque poco probable), y un buen software puede ser mal valuado por el usuario (créanme, sucede). Entonces la política de calidad de la empresa en general es distinta a la política de calidad del software en sí. Pese a muchas opiniones, el software es el código y nada más. Otras cosas le van unidas, pero no son software.</p>
<p>En Pragmatic Programme Hunt y Thomas exponen un punto importante: software lo suficientemente bueno. En ocasiones, especialmente cuando no hay restricciones de calendario, el desarrollador quiere siempre mejorar su software. Irónicamemte un software puede ser siempre mejorado. Hay que aprender cuando un software es lo suficientemnete bueno, porque agregarle funcionalidad o mejoras puede ser hasta contraproducente si no se sabe donde parar. Al final esto es ingeniería de software, y como todas las ingenierías nuestro objetivo es calcular. Si voy a comprar alambre para cercas las plantas de mi casa puedo calcular la circunferencia usando 3 en vez de pi, si voy calcular los materiales necesarios para un edificio redondo seguramente usaré 3.14159 o tal vez más dígitos, y si estoy calculando la órbita de una nave espacial definitivamente usaré más decimales. Hay que saber cual me conviene más. Lo mismo en el software.</p>
<p>Existe un ISO, el 9126 que se dedica a la calidad de software tiene puntos muy interesantes. Especialmente me gustó la división que hacen para medir la calidad: la calidad del modelo, la calidad de la métrica externa, la de la métrica interna y la calidad en el uso de las métricas. Está también CMMI que se dedica a la calidad estandarizar la calidad del software y la calidad del proceso productivo de éste.</p>
<p>En fin la calidad de software es algo que radica entre lo objetivo y lo subjetivo. Hay mucha leña por ahí para partir, porque el universo del software es también dinámico y los parámetros también cambian. Cada equipo de trabajo tiene sus propios parámetros. Lo que quiero recalcar es que cada equipo debe definir cuales son sus parámetros para medir la calidad de su software. Luego modelar, diseñar, implementar y mantener el software apegado a esos claves. En cada proyecto el orden de prioridades cambian también y hay que tenerlo presente, porque al final de los cantares lo que queremos es que nuestro software funcione, le guste al usuario y se acerque lo más ppsible a hacer lo que tiene que hacer.</p>
<p><small><strong><br />
Luis H. Fernandez<br />
luishernan@gmail.com<br />
</strong></small><br />
Algunos links.</p>
<p>http://synergix.wordpress.com/2008/07/02/modelo-de-calidad-tradicional-del-software/</p>
<p>http://blog.xebia.com/2008/11/05/what-exactly-is-software-quality/</p>
<p>http://en.wikipedia.org/wiki/Software_quality</p>
<p>http://satc.gsfc.nasa.gov/support/STC_APR96/qualtiy/stc_qual.PDF</p>
<p>http://en.wikipedia.org/wiki/ISO_9126</p>
<p>http://www.bth.se/tek/besq.nsf/(WebFiles)/CF1C3230DB425EDCC125706900317C44/$FILE/chapter_1.pdf</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fcalidad-del-software&amp;linkname=Calidad%20del%20software"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/calidad-del-software/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web o desktop?</title>
		<link>http://software.guisho.com/web-o-desktop</link>
		<comments>http://software.guisho.com/web-o-desktop#comments</comments>
		<pubDate>Tue, 25 Nov 2008 01:33:24 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Discutiendo tecnologias]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=14</guid>
		<description><![CDATA[Web o Stand-alone?
Hay un nuevo proyecto que deseo comenzar. Es sumamente agradable poder elegir la tecnología a usar, pero a la vez puede causar un gran dolor de cabeza debido a la gran, inmensa, gigantesca, cantidad de opciones que se abren. ¿Qué tecnología uso? ¿Web o no web? ¿Java, C++ o .net? ¿Qué DBMS?
Cuando un [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Web o Stand-alone?</p>
<p>Hay un nuevo proyecto que deseo comenzar. Es sumamente agradable poder elegir la tecnología a usar, pero a la vez puede causar un gran dolor de cabeza debido a la gran, inmensa, gigantesca, cantidad de opciones que se abren. ¿Qué tecnología uso? ¿Web o no web? ¿Java, C++ o .net? ¿Qué DBMS?<span id="more-14"></span></p>
<p>Cuando un cliente pone las reglas, el rango de acción disminuye: nosotros trabajamos IIS en Windows, o nosotros MySQL en Linux, con PHP, o nosotros una opción barata de hosting, y un gran etc. Pero cuando pensamos en desarrollar un nuevo producto ¿qué tecnología usar?</p>
<p>En principio, debido a mi experiencia anterior y mi área de conocimiento, siempre tiendo a ver todas las soluciones bajo la lupa  web. Creo que en un futuro no muy lejano las aplicaciones de desktop irán desapareciendo. Hace más de diez años teníamos ya los applets, y es irónico como las nuevas tecnologías comienzan a tener ese punto de vista.</p>
<p>Hay aplicaciones que son de naturaleza web, y tendrían poco sentido hacerlas desktop, por ejemplo las redes sociales, buscadores, sitios de noticias, etc. Hay aplicaciones que son de naturaleza desktop y que no tendría sentido volverlas web: compiladores, aplicaciones de oficinas, IDEs, etc. Sin embargo las cosas han cambiado y muchas de estas aplicaciones están migrando al mundo web. Hay una intersección cada vez mayor entre las aplicaciones web y las desktop.</p>
<p>Web o desktop. La mayor parte de aplicaciones empresariales (tema para otro post) pueden perfectamente ser desarrolladas en ambas tecnologías, con las ventajas y desventajas de cada una. A mi opinión la decisión en cuánto al enfoque que se debe tomar depende de dos cosas: costo y tiempo.</p>
<p>Creo que una aplicación desarrollada bajo el paradigma web o bajo el paradigma de escritorio debería poder ser compilada o &#8220;deployada&#8221; en cualquiera de los dos contextos. Todavía no he encontrado muy asentado este concepto pero creo que debería comenzar a predominar. Pero el mundo no es color de rosa, y las cosas no funcionan así.</p>
<p>Hay ya muchos frameworks que permiten programar aplicaciones web como si fueran de escritorio (Wicket por ejemplo), pero todavía están un poco verdes en su desarrollo. Cada aplicación tiene un contexto definido y unas restricciones que deben respetar, pero considero que es mejor idea hacer las aplicaciones web, aunque al decirlo todavía hay algo que siento no me deja aconsejarlo tranquilamente.</p>
<p>Ventajas de web.<br />
+Multiplataforma para el cliente.<br />
+No hay necesidad de actualizaciones.<br />
+Centralizado.</p>
<p>Ventajas de escritorio.<br />
+El usuario está más acostumbrado.<br />
+No se necesita un server.<br />
+Aplicaciones muy pesadas deben correr en el cliente.</p>
<p><small><br />
Luis H. Fernandez<br />
luishernan@gmail.com<br />
</small></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fweb-o-desktop&amp;linkname=Web%20o%20desktop%3F"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/web-o-desktop/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Buenas prácticas: Manejo de versiones.</title>
		<link>http://software.guisho.com/buenas-practicas-manejo-de-versiones</link>
		<comments>http://software.guisho.com/buenas-practicas-manejo-de-versiones#comments</comments>
		<pubDate>Fri, 21 Nov 2008 18:42:42 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Buenas prácticas]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[manejo de versiones]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=12</guid>
		<description><![CDATA[Un día de trabajo pesado, muchos problemas resueltos y una de las partes más difíciles del proyecto superada. Pluck, por alguna razón el editor se cierra. Un gran puñetazo en el escritorio: perdimos los cambios. O tal vez fue un gran cambio que comenzamos a hacer y no funcionó. Todos hemos pasado uno que otro [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Un día de trabajo pesado, muchos problemas resueltos y una de las partes más difíciles del proyecto superada. Pluck, por alguna razón el editor se cierra. Un gran puñetazo en el escritorio: perdimos los cambios. O tal vez fue un gran cambio que comenzamos a hacer y no funcionó. Todos hemos pasado uno que otro mal momento por no saber organizar nuestro trabajo.<span id="more-12"></span></p>
<p>De las buenas prácticas de desarrollo de software que quiero sacar a discusión, comenzaré con el manejo de fuentes. Sorprendentemente el manejo de fuentes y de versiones no se toma tan en serio como debería. Muchas veces he estado en proyectos, o los he visto, en los que muchos, muchísimos problemas surgen debido a espaguetis de código mal unidos, versiones que se creían diferentes, trabajo que se pierde.</p>
<p>Sobre la teoría del manejo de versiones se ha hablado mucho ya. No es algo sencillo en lo más mínimo, a mí me sigue asombrando lo eficientes que SVN o CVS son a pesar de lo complejo de su funcionamiento. Muchos buenos manuales existen para aprender a usar SVN o CVS. Yo en general me iría con alguno de ellos dos, aunque a la gente del entorno MS le podría servir más aprender sourcesafe.</p>
<p>Independientemente, mi punto es el siguiente: SIEMPRE hay que usar algún manejador de versiones. Es la primera cosa que un proyecto serio requiere. Es algo que ni siquiera debe ser apuntado, sino que siempre entendido que habrá un manejo de versiones.</p>
<p>¿Por qué? En lo personal las siguientes razones son los motivos por los qué uso un manejador de veriones.<br />
+Backup. Son una manera muy sencilla para hacer copias de respaldo. Aunque sea una diaria.<br />
+Cambios. Cuando quiero hacer un cambio peligroso, me quita el miedo de pasarme llevando algo por delante. Si eso pasara, simplemente vuelvo a una versión anterior.<br />
+Manejo de versiones en sí. Un cliente quiere unas cosas, el otro otras, pero la base es la misma. Puedo mantener las fuentes exactas de cada instalación, añadir nuevas cosas y luego unirlas. Es una maravilla.<br />
+Trabajo en equipo. El manejo de una manejador de versiones facilita enormemente el trabajo en equipo. Al final del día siempre hay una versión, igual para todos, y los cambios de cada uno los ve el otro. OJO un error común es es tratar al manejador como el que solucionará todos los problemas y no es cierto. La comunicación entre el equipo es siempre vital.<br />
+Es sencillo. Cualquier IDE te permite importar tus fuentes a un repositorio y trabajar a partir de él sin mucho trabajo, incluso si estás comenzando a usar una manejador.</p>
<p>En resumen, en cualquier proyecto lo primero que deben hacer SIEMPRE es utilizar una manejador de versiones. Mis consejos son utlizar SVN o CVS, son sencillos, son libres, la mayoría de IDEs tiene extensiones para ellos y sobre todo les van a hacer la vida más sencilla.<br />
<small><br />
Luis H. Fernández<br />
luishernan@gmail.com<br />
</small></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fbuenas-practicas-manejo-de-versiones&amp;linkname=Buenas%20pr%C3%A1cticas%3A%20Manejo%20de%20versiones."><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/buenas-practicas-manejo-de-versiones/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 6.5</title>
		<link>http://software.guisho.com/netbeans-65</link>
		<comments>http://software.guisho.com/netbeans-65#comments</comments>
		<pubDate>Wed, 19 Nov 2008 23:43:28 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[producto]]></category>

		<guid isPermaLink="false">http://software.guisho.com/archives/8</guid>
		<description><![CDATA[Hoy se dio el anuncio oficial de netbeans 6.5. Sin duda los amantes de Java están con las ganas puestas para probarlo y ver las nuevas cosas que tiene. Ahora lo estoy bajando para probarlo, ya tenía el Release Candidate 2, pero no hay nada como tener la versión final. Hay muchas cosas interesantes, entre [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Hoy se dio el <a href="http://www.netbeans.org/community/releases/65/">anuncio oficial de netbeans 6.5</a>. Sin duda los amantes de Java están con las ganas puestas para probarlo y ver las nuevas cosas que tiene. Ahora lo estoy bajando para probarlo, ya tenía el Release Candidate 2, pero no hay nada como tener la versión final. Hay muchas cosas interesantes, entre ellas es la importación y sincronización de proyectos con <a href="http://www.eclipse.org/">eclipse.</a> Esta característica me llama mucho la atención porque me permite trabajar con los dos editores.<span id="more-8"></span></p>
<p><a href="http://software.guisho.com/wp-content/uploads/2008/11/net.png"><img class="alignleft size-medium wp-image-9" title="net" src="http://software.guisho.com/wp-content/uploads/2008/11/net-300x189.png" alt="" width="300" height="189" /></a></p>
<p>De hecho creo que la comunidad Java debía proponer un JSR pronto para la organización de proyectos en los IDEs, de tal manera que al crear un proyecto en netbeans, lo pueda abrir en eclipse, intelliJ, JDeveloper, o cualquier otro que se ponga enfrente, creo que sería de mucha utlidad.</p>
<p style="text-align: right;">luishernan@gmail.com</p>
<p style="color:#008;text-align:right;"><small><em><br />
</em></small></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fnetbeans-65&amp;linkname=Netbeans%206.5"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/netbeans-65/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Español, español&#8230;español en inglés</title>
		<link>http://software.guisho.com/espanol-espanolespanol-en-ingles</link>
		<comments>http://software.guisho.com/espanol-espanolespanol-en-ingles#comments</comments>
		<pubDate>Wed, 19 Nov 2008 23:26:51 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=7</guid>
		<description><![CDATA[No sólo en el software, sino que en muchas áreas, el inglés ha sido una lengua que ha metido sus narices en todas las culturas. En la nuestra con especial fuerza: programamos en inglés. Al menos yo, no conozco un lenguaje de programación cuyas palabras clave estén escritas en otro idioma. Tiene sus ventajas el [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>No sólo en el software, sino que en muchas áreas, el inglés ha sido una lengua que ha metido sus narices en todas las culturas. En la nuestra con especial fuerza: programamos en inglés. Al menos yo, no conozco un lenguaje de programación cuyas palabras clave estén escritas en otro idioma. Tiene sus ventajas el uso del inglés: es más corto. Pero sobro todo tiene la ventaja de que todos podemos ponernos de acuerdo en un idioma para comunicarnos.<span id="more-7"></span></p>
<p>Y no sólo las palabras claves se escriben en inglés. Los foros, las comunidades se construyen en inglés. Las documentaciones y los bugs, todo se hace en inglés. Cuando nos topamos con algún problema extraño, llegaremos con foros en los que muchas veces ninguno de los participantes habla inglés como lengua materna, pero todos hablan inglés para intercomunicarse. Me causa gracia cuando en un foro me comunico con personas de Irlanda, India, Brasil, Rumania, México, Alemania, Rusia y etc. Me asobmra que todos nos podamos comunicar. De no existir el inglés simplemente no habría un medio de comunicación. Cuando busco un software nuevo, o alguna herramienta por ahí, espero que la página esté en inglés. Incluso cuando la página tiene una versión española, prefiero batirme con la que está escrita en la lengua de shakespeare. Sin duda el inglés permite la existencia y el crecimiento de una comunidad muy grande de desarrolladores.</p>
<p>Pero hablar español nos cuesta plata. Hacer programas en español nos cuesta más plata y tiempo que hacerlos en inglés. Usar ñ,á,é,í,ó,ú,ü,¿,¡ y alguno que otro por ahí es sumamente caro. Nuestro idioma tiene poco o ninguna influencia en el mundo del software. Tanto así que la misma palabra &#8220;software&#8221; la tuvimos que traer del inglés tal y como estaba. Sí, el inglés nos ayuda a aprender, pero nuestras aplicaciones las escribimos en español. Y eso no siempre es tan sencillo como parece.  Muchos de los que leen estas letras sin duda han tenido más de alguna rabieta cuando ven que en su software aparecen Ã­,Ã¡&amp;#65533;,Ã©,Ã  y otro buen montón de simbolitos raros. O cuando uno tiene que hacer maravillas para hacer que funcione una base de datos con encoding latin-1, un server con ISO-8859-1 y una aplicación con UTF-8. Alguien, con un toque de sátira, dijo una vez &#8220;lo bueno de los estándares es que hay muchos&#8221;. Más de alguno se ha puesto a llorar cuando hace un pequeño cambio y ve que cambia al charset que. Todos estamos acostumbrados a términos de charset, asdfasd, asdfasd.</p>
<p>En lo personal intento tratar de usar siempre UTF8, pero no siempre es posible debido a que en ocasiones no tengo el control sobre la plataforma en la que instalaré. Este es el primer post sobre el español y el inglés que haré. Hay muchos libros y muchos lugares en los que se puede obtener información sobre como hacer mejor software, pero esos siempre son en inglés (ironías), así que pienso comenzar la discusión para aquellos que hablamos español&#8230;.¿cómo podemos mejorar el software en español? Lo gracioso es que siempre estaremos escribiendo aplicaciones en español definiéndolas en inglés.</p>
<p style="color:#008;text-align:right;"> </p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fespanol-espanolespanol-en-ingles&amp;linkname=Espa%C3%B1ol%2C%20espa%C3%B1ol%26%238230%3Bespa%C3%B1ol%20en%20ingl%C3%A9s"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/espanol-espanolespanol-en-ingles/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bienvenidos</title>
		<link>http://software.guisho.com/bienvenidos</link>
		<comments>http://software.guisho.com/bienvenidos#comments</comments>
		<pubDate>Wed, 19 Nov 2008 17:39:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ingeniería de software]]></category>
		<category><![CDATA[Bienvenidos]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=3</guid>
		<description><![CDATA[ Abro este espacio para lograr un poco de discusión y para exponer mis ideas sobre el desarrollo de software. Si estás leyendo estas letras es porque te gusta programar, porque de otra manera no te interesa mucho lo que diré.
 Creo que el desarrollo de software sufre un estancamiento severo. Hemos desarrollado nuevas e [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><span> </span>Abro este espacio para lograr un poco de discusión y para exponer mis ideas sobre el desarrollo de software. Si estás leyendo estas letras es porque te gusta programar, porque de otra manera no te interesa mucho lo que diré.</p>
<p><span> </span>Creo que el desarrollo de software sufre un estancamiento severo. Hemos desarrollado nuevas e interesantes técnicas, modelos de manejo de datos, metodologías de desarrollo, y un sin fin de formas para hacer las cosas. La nuestra es una tarea altamente intelectual y hemos estado viendo como hacernos la vida más sencilla.</p>
<p><span> </span>Sin embargo los tiempos y costos de desarrollo permanecen iguales, sino es que han crecido más. El estallido de GUIs con mucho entorno gráfico han añadido dificultad a nuestra tarea. El desarrollo en web se ha tornado altamente dominante, y los usuarios esperan webs bonitas, pero a nosotros, por lo general, no nos gusta hacer cosas bonitas, nos gusta hacer cosas que funcionen. Han aparecido los diseñadores gráficos, cosa que no es mala en sí, pero no han aparecido formas de lograr una simbiosis entre programadores y diseñadores gráficos.</p>
<p><span> </span>Todos aprendemos nuevas tecnologías y frameworks constantemente. Aparecen, y queremos usarlos. Algunas de estas ideas fructifican y se convierten en estándares de facto. Muchas otras crean un gran alboroto pero terminan quedando en lo que algunos llaman shelfware, es decir en la librera guardados y considerados como ideas interesantes pero que no aplican.</p>
<p><span> </span>Finalmente, creo que el software es una gran oportunidad de desarrollo para Latinoamérica. La inversión en software es relativamente pequeña: una computadora y alguien que sepa usarla. No se precisan de multimilonarias fábricas ni materias primas. Necesitamos personas educadas que sepan manejar y crear y software. Siempre me he preguntado: ¿por qué de los miles de frameworks que aparecen, hay tan pocos latinoamericanos? Y cuando de casualidad me encuentro con uno de origen latinoamericano, generalmente es brasileño. Este blog tambien quiero que sea una invitación, que lance una espinita, para que desarrolladores hispanos nos pongamos las pilas y creemos. Tenemos la capacidad, aunque nos hemos dormido.</p>
<p><span> </span>Así que bienvenidos, ojalá aparezca pronto la crítica y las ideas. El nuestro es un mundo precioso, así que démosle un toque con ñ.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?&amp;linkurl=http%3A%2F%2Fsoftware.guisho.com%2Fbienvenidos&amp;linkname=Bienvenidos"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Save/Bookmark"/></a>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/bienvenidos/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
