<?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/"
	>

<channel>
	<title>Guisho</title>
	<atom:link href="http://guisho.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://guisho.com</link>
	<description>Guisho.com</description>
	<pubDate>Thu, 14 May 2009 05:07:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Singleton Pattern — Patrones de diseño</title>
		<link>http://software.guisho.com/archives/101</link>
		<comments>http://software.guisho.com/archives/101#comments</comments>
		<pubDate>Thu, 14 May 2009 05:07:01 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></description>
			<content:encoded><![CDATA[<p>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" ><span >public</span> <span >class</span> Traductor<span >&#123;</span>
      <span >private</span> <span >static</span> <span >boolean</span> instanciated<span >=</span><span >false</span><span >;</span>
      <span >private</span> <span >static</span> Traductor traductorInstance<span >;</span>
&nbsp;
     <span >/**
       *Notar que el constructor es privado!
      */</span>
      <span >private</span> Traductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
          <span >//cargar un diccionario a memoria  a través de un WebService. </span>
     <span >&#125;</span>
&nbsp;
    <span >public</span> <span >static</span> Traductor getTraductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
           <span >if</span> <span >&#40;</span><span >!</span> Traductor.<span >instanciated</span><span >&#41;</span><span >&#123;</span>
                 Traductor.<span >traductorInstance</span><span >=</span> <span >new</span> Traductor<span >&#40;</span><span >&#41;</span><span >;</span>
                 Traductor.<span >instanciated</span><span >=</span><span >true</span><span >;</span>
           <span >&#125;</span> 
          <span >return</span> Traductor.<span >traductorInstance</span><span >;</span>
   <span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> translate<span >&#40;</span><span >String</span> toTranslate<span >&#41;</span><span >&#123;</span>
       <span >//mucho código bonito va aquí</span>
    <span >&#125;</span> 
&nbsp;
<span >&#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" >Traductor.<span >getTraductor</span><span >&#40;</span><span >&#41;</span>.<span >translate</span><span >&#40;</span><span >&quot;unaPalabra&quot;</span><span >&#41;</span><span >;</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" >Traductor t <span >=</span> <span >new</span> Traductor<span >&#40;</span><span >&#41;</span><span >;</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" ><span >public</span> <span >class</span> Traductor<span >&#123;</span>
      <span >private</span> <span >static</span>  Traductor traductorInstance<span >=</span><span >null</span><span >;</span>
      <span >/**
       *Notar que el constructor es privado!
      */</span>
      <span >private</span> Traductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
          <span >//cargar un diccionario a memoria  a través de un WebService. </span>
     <span >&#125;</span>
&nbsp;
    <span >public</span> <span >static</span> Traductor getTraductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
           <span >if</span> <span >&#40;</span><span >!</span> Traductor.<span >INSTANCE</span><span >==</span><span >null</span><span >&#41;</span><span >&#123;</span>
                 Traductor.<span >traductorInstance</span><span >=</span> <span >new</span> Traductor<span >&#40;</span><span >&#41;</span><span >;</span>
           <span >&#125;</span> 
          <span >return</span> Traductor.<span >traductorInstance</span><span >;</span>
   	<span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> translate<span >&#40;</span><span >String</span> toTranslate<span >&#41;</span><span >&#123;</span>
       <span >//mucho código bonito va aquí</span>
    <span >&#125;</span> 
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> Traductor<span >&#123;</span>
      <span >private</span> <span >static</span>  Traductor traductorInstance<span >=</span><span >new</span> Traductor<span >&#40;</span><span >&#41;</span><span >;</span>
      <span >/**
       *Notar que el constructor es privado!
      */</span>
      <span >private</span> Traductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
          <span >//cargar un diccionario a memoria  a través de un WebService. </span>
     <span >&#125;</span>
&nbsp;
    <span >public</span> <span >static</span> Traductor getTraductor<span >&#40;</span><span >&#41;</span><span >&#123;</span>
           <span >return</span> Traductor.<span >traductorInstance</span><span >;</span>
   	<span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> translate<span >&#40;</span><span >String</span> toTranslate<span >&#41;</span><span >&#123;</span>
       <span >//mucho código bonito va aquí</span>
    <span >&#125;</span> 
&nbsp;
<span >&#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" >Traductor t <span >=</span> <span >&#40;</span>Traductor<span >&#41;</span>Traductor.<span >getTraductor</span><span >&#40;</span><span >&#41;</span>.<span >clone</span><span >&#40;</span><span >&#41;</span><span >;</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" >     <span >public</span> <span >Object</span> clone<span >&#40;</span><span >&#41;</span> <span >throws</span> <span >CloneNotSupportedException</span> <span >&#123;</span>
         <span >throw</span> <span >new</span> <span >CloneNotSupportedException</span><span >&#40;</span><span >&#41;</span><span >;</span>
       <span >&#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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/101/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Abstract Factory Pattern - Patrones</title>
		<link>http://software.guisho.com/archives/86</link>
		<comments>http://software.guisho.com/archives/86#comments</comments>
		<pubDate>Wed, 06 May 2009 03:53:26 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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, [...]]]></description>
			<content:encoded><![CDATA[<p>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" ><span >public</span> <span >abstract</span> <span >class</span> Reloj <span >&#123;</span>
&nbsp;
    <span >abstract</span> <span >String</span> dameLaHora<span >&#40;</span><span >&#41;</span><span >;</span>
<span >&#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" ><span >public</span> <span >class</span> RelojAmPm <span >extends</span> Reloj<span >&#123;</span>
&nbsp;
    <span >public</span> RelojAmPm<span >&#40;</span><span >&#41;</span><span >&#123;</span>
&nbsp;
    <span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> dameLaHora<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >Date</span> d <span >=</span> <span >new</span> <span >Date</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> hora <span >=</span> d.<span >getHours</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> minutos <span >=</span> d.<span >getMinutes</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> segundos <span >=</span> d.<span >getSeconds</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >String</span> tr<span >;</span>
        <span >if</span> <span >&#40;</span>hora<span >&amp;</span>lt<span >;=</span><span >12</span><span >&#41;</span><span >&#123;</span>
            tr<span >=</span><span >&quot;Son las &quot;</span><span >+</span>hora<span >+</span><span >&quot;:&quot;</span><span >+</span>minutos<span >+</span><span >&quot;:&quot;</span><span >+</span>segundos<span >+</span><span >&quot; AM&quot;</span><span >;</span>
        <span >&#125;</span> <span >else</span> <span >&#123;</span>
            tr<span >=</span><span >&quot;Son las &quot;</span><span >+</span><span >&#40;</span>hora<span >-</span><span >12</span><span >&#41;</span><span >+</span><span >&quot;:&quot;</span><span >+</span>minutos<span >+</span><span >&quot;:&quot;</span><span >+</span>segundos<span >+</span><span >&quot; PM&quot;</span><span >;</span>
        <span >&#125;</span>
&nbsp;
        <span >return</span> tr<span >;</span>
    <span >&#125;</span>
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> Reloj24Hrs <span >extends</span> Reloj <span >&#123;</span>
&nbsp;
    <span >public</span> <span >String</span> dameLaHora<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >Date</span> d <span >=</span> <span >new</span> <span >Date</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> hora <span >=</span> d.<span >getHours</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> minutos <span >=</span> d.<span >getMinutes</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >int</span> segundos <span >=</span> d.<span >getSeconds</span><span >&#40;</span><span >&#41;</span><span >;</span>
        <span >String</span> tr<span >;</span>
        tr <span >=</span> <span >&quot;Son las &quot;</span> <span >+</span> hora <span >+</span> <span >&quot;:&quot;</span> <span >+</span> minutos <span >+</span> <span >&quot;:&quot;</span> <span >+</span> segundos <span >+</span> <span >&quot; &quot;</span><span >;</span>
&nbsp;
        <span >return</span> tr<span >;</span>
    <span >&#125;</span>
<span >&#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" ><span >public</span> <span >class</span> RelojFactory <span >&#123;</span>
    <span >public</span> <span >static</span> <span >final</span> <span >int</span> RELOJ_AM_PM<span >=</span><span >0</span><span >;</span>
    <span >public</span> <span >static</span> <span >final</span> <span >int</span> RELOJ_24_HRS<span >=</span><span >1</span><span >;</span>
&nbsp;
    <span >public</span> RelojFactory<span >&#40;</span><span >&#41;</span><span >&#123;</span>
&nbsp;
    <span >&#125;</span>
&nbsp;
    <span >public</span> <span >static</span> Reloj createReloj<span >&#40;</span><span >int</span> tipoDeReloj<span >&#41;</span><span >&#123;</span>
        <span >if</span> <span >&#40;</span>tipoDeReloj<span >==</span>RelojFactory.<span >RELOJ_24_HRS</span><span >&#41;</span><span >&#123;</span>
            <span >return</span> <span >new</span> Reloj24Hrs<span >&#40;</span><span >&#41;</span><span >;</span>
        <span >&#125;</span>
        <span >if</span> <span >&#40;</span>tipoDeReloj<span >==</span>RelojFactory.<span >RELOJ_AM_PM</span><span >&#41;</span><span >&#123;</span>
            <span >return</span> <span >new</span> RelojAmPm<span >&#40;</span><span >&#41;</span><span >;</span>
        <span >&#125;</span>
&nbsp;
        <span >return</span> <span >null</span><span >;</span>
    <span >&#125;</span>
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> MainClient <span >&#123;</span>
&nbsp;
    <span >public</span> <span >static</span> <span >void</span> main<span >&#40;</span><span >String</span><span >&#91;</span><span >&#93;</span> args<span >&#41;</span> <span >&#123;</span>
        Reloj r <span >=</span> RelojFactory.<span >createReloj</span><span >&#40;</span>RelojFactory.<span >RELOJ_24_HRS</span><span >&#41;</span><span >;</span>
        <span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span>r.<span >dameLaHora</span><span >&#40;</span><span >&#41;</span><span >&#41;</span><span >;</span>
    <span >&#125;</span>
<span >&#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" ><span >public</span> <span >abstract</span> <span >class</span> AbstractLocaleFactory <span >&#123;</span>
    <span >public</span> <span >static</span> <span >final</span> <span >String</span> US<span >=</span><span >&quot;ESTADOS_UNIDOS&quot;</span><span >;</span>
    <span >public</span> <span >static</span> <span >final</span> <span >String</span> GT<span >=</span><span >&quot;GUATEMALA&quot;</span><span >;</span>
&nbsp;
    <span >String</span> pais<span >;</span>
&nbsp;
    <span >public</span> <span >abstract</span> Traductor createTraductor<span >&#40;</span><span >&#41;</span><span >;</span>
    <span >public</span> <span >abstract</span> Reloj createReloj<span >&#40;</span><span >&#41;</span><span >;</span>
&nbsp;
    <span >public</span> <span >String</span> getPais<span >&#40;</span><span >&#41;</span><span >&#123;</span>
        <span >return</span> <span >this</span>.<span >pais</span><span >;</span>
    <span >&#125;</span>
&nbsp;
    <span >public</span> <span >void</span> setPais<span >&#40;</span><span >String</span> pais<span >&#41;</span><span >&#123;</span>
        <span >this</span>.<span >pais</span> <span >=</span> pais<span >;</span>
    <span >&#125;</span>
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> LocaleGuatemalaFactory <span >extends</span> AbstractLocaleFactory<span >&#123;</span>
&nbsp;
    <span >public</span> LocaleGuatemalaFactory<span >&#40;</span><span >&#41;</span><span >&#123;</span>
        <span >this</span>.<span >pais</span><span >=</span><span >this</span>.<span >GT</span><span >;</span>
    <span >&#125;</span>
    <span >public</span> Traductor createTraductor<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >return</span> TraductorFactory.<span >createTraductor</span><span >&#40;</span><span >&quot;espanol&quot;</span><span >&#41;</span><span >;</span>
    <span >&#125;</span>
&nbsp;
    <span >public</span> Reloj createReloj<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >return</span> RelojFactory.<span >createReloj</span><span >&#40;</span>RelojFactory.<span >RELOJ_24_HRS</span><span >&#41;</span><span >;</span>
    <span >&#125;</span>
&nbsp;
<span >&#125;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="java" ><span >public</span> <span >class</span> LocaleEstadosUnidosFactory <span >extends</span> AbstractLocaleFactory<span >&#123;</span>
&nbsp;
    <span >public</span> LocaleEstadosUnidosFactory<span >&#40;</span><span >&#41;</span><span >&#123;</span>
        <span >this</span>.<span >pais</span><span >=</span>AbstractLocaleFactory.<span >US</span><span >;</span>
    <span >&#125;</span>
&nbsp;
    <span >public</span> Traductor createTraductor<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >return</span> TraductorFactory.<span >createTraductor</span><span >&#40;</span><span >&quot;ingles&quot;</span><span >&#41;</span><span >;</span>
    <span >&#125;</span>
&nbsp;
    <span >public</span> Reloj createReloj<span >&#40;</span><span >&#41;</span> <span >&#123;</span>
        <span >return</span> RelojFactory.<span >createReloj</span><span >&#40;</span>RelojFactory.<span >RELOJ_AM_PM</span><span >&#41;</span><span >;</span>
    <span >&#125;</span>
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> MainClient <span >&#123;</span>
&nbsp;
    <span >public</span> <span >static</span> <span >void</span> main<span >&#40;</span><span >String</span><span >&#91;</span><span >&#93;</span> args<span >&#41;</span> <span >&#123;</span>
&nbsp;
        Reloj reloj <span >=</span> <span >null</span><span >;</span>
        Traductor traductor <span >=</span> <span >null</span><span >;</span>
&nbsp;
        AbstractLocaleFactory localeFactory <span >=</span> <span >new</span> LocaleGuatemalaFactory<span >&#40;</span><span >&#41;</span><span >;</span>
        reloj <span >=</span> localeFactory.<span >createReloj</span><span >&#40;</span><span >&#41;</span><span >;</span>
        traductor <span >=</span> localeFactory.<span >createTraductor</span><span >&#40;</span><span >&#41;</span><span >;</span>
&nbsp;
        <span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span><span >&quot;--------&quot;</span><span >&#41;</span><span >;</span>
        <span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span><span >&quot;1=&quot;</span><span >+</span>traductor.<span >traducirNumero</span><span >&#40;</span><span >1</span><span >&#41;</span><span >&#41;</span><span >;</span>
        <span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span>reloj.<span >dameLaHora</span><span >&#40;</span><span >&#41;</span><span >&#41;</span><span >;</span>
&nbsp;
    <span >&#125;</span>
<span >&#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" >        AbstractLocaleFactory localeFactory <span >=</span> <span >new</span> LocaleGuatemalaFactory<span >&#40;</span><span >&#41;</span><span >;</span></pre></div></div>

<p>Por esta</p>

<div class="wp_syntax"><div class="code"><pre class="java" >        AbstractLocaleFactory localeFactory <span >=</span> <span >new</span> LocaleEstadosUnidosFactory<span >&#40;</span><span >&#41;</span><span >;</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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/86/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Factory Pattern - Patrones</title>
		<link>http://software.guisho.com/archives/55</link>
		<comments>http://software.guisho.com/archives/55#comments</comments>
		<pubDate>Tue, 28 Apr 2009 22:57:49 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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, [...]]]></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(&#8221;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" ><span >public</span> <span >class</span> MainClient <span >&#123;</span>
<span >public</span> MainClient<span >&#40;</span><span >&#41;</span><span >&#123;</span>
     <span >&#125;</span>
&nbsp;
	<span >public</span> traducirNumero<span >&#40;</span><span >String</span> idioma, <span >int</span> numero<span >&#41;</span><span >&#123;</span>
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;español&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
		  <span >switch</span> <span >&#40;</span>numero<span >&#41;</span><span >&#123;</span>
		     <span >case</span> <span >0</span><span >:</span> <span >return</span> <span >&quot;uno&quot;</span><span >;</span>
		     <span >case</span> <span >1</span><span >:</span> <span >return</span> <span >&quot;dos&quot;</span><span >;</span>
		    ....
		   <span >&#125;</span>
		<span >&#125;</span>
&nbsp;
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;english&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
		    <span >switch</span> <span >&#40;</span>numero<span >&#41;</span><span >&#123;</span>
		     <span >case</span> <span >0</span><span >:</span> <span >return</span> <span >&quot;one&quot;</span><span >;</span>
		     <span >case</span> <span >1</span><span >:</span> <span >return</span> <span >&quot;two&quot;</span><span >;</span>
		    ....
		    <span >&#125;</span>
		<span >&#125;</span> 
&nbsp;
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;deutsch&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
		    <span >switch</span> <span >&#40;</span>numero<span >&#41;</span><span >&#123;</span>
		     <span >case</span> <span >0</span><span >:</span> <span >return</span> <span >&quot;eins&quot;</span><span >;</span>
		     <span >case</span> <span >1</span><span >:</span> <span >return</span> <span >&quot;zwei&quot;</span><span >;</span>
		    ....
		    <span >&#125;</span>
		<span >&#125;</span>
	<span >&#125;</span><span >//traducirNumero</span>
       
<span >public</span> <span >static</span> <span >void</span> main<span >&#40;</span><span >String</span> args<span >&#91;</span><span >&#93;</span><span >&#41;</span><span >&#123;</span>
MainClient mc <span >=</span> <span >new</span> MainClient<span >&#40;</span><span >&#41;</span><span >;</span>
<span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span>mc.<span >traducirNumero</span><span >&#40;</span><span >&quot;espanol&quot;</span>,<span >1</span><span >&#41;</span><span >&#41;</span><span >;</span>
<span >&#125;</span>
<span >&#125;</span><span >//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" ><span >public</span> <span >abstract</span> <span >class</span> Traductor<span >&#123;</span>
&nbsp;
   <span >public</span> <span >abstract</span> <span >String</span> traducirNumero<span >&#40;</span><span >int</span> numero<span >&#41;</span><span >;</span>
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> TraductorEspanol <span >extends</span> Traductor <span >&#123;</span>
&nbsp;
    <span >public</span> TraductorEspanol<span >&#40;</span><span >&#41;</span><span >&#123;</span>
       <span >super</span><span >&#40;</span><span >&#41;</span><span >;</span>
       ...
    <span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> traducirNumero<span >&#40;</span><span >int</span> numero<span >&#41;</span><span >&#123;</span>
       <span >switch</span><span >&#40;</span>numero<span >&#41;</span><span >&#123;</span>
       	   <span >case</span> <span >1</span><span >:</span> <span >return</span> <span >&quot;uno&quot;</span><span >;</span>
       	   <span >case</span> <span >2</span><span >:</span> <span >return</span> <span >&quot;dos&quot;</span><span >;</span>
       	   ...
       <span >&#125;</span>
    <span >&#125;</span>	
&nbsp;
<span >&#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" ><span >public</span> <span >class</span> TraductorIngles <span >extends</span> Traductor <span >&#123;</span>
&nbsp;
    <span >public</span> TraductorIngles<span >&#40;</span><span >&#41;</span><span >&#123;</span>
       <span >super</span><span >&#40;</span><span >&#41;</span><span >;</span>
       ...
    <span >&#125;</span>
&nbsp;
    <span >public</span> <span >String</span> traducirNumero<span >&#40;</span><span >int</span> numero<span >&#41;</span><span >&#123;</span>
       <span >switch</span><span >&#40;</span>numero<span >&#41;</span><span >&#123;</span>
       	   <span >case</span> <span >1</span><span >:</span> <span >return</span> <span >&quot;one&quot;</span><span >;</span>
       	   <span >case</span> <span >2</span><span >:</span> <span >return</span> <span >&quot;two&quot;</span><span >;</span>
       	   ...
       <span >&#125;</span>
    <span >&#125;</span>	
&nbsp;
<span >&#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" >Traductor t <span >=</span> <span >new</span> TraductorEspanol<span >&#40;</span><span >&#41;</span><span >;</span>
t.<span >traducirNumero</span><span >&#40;</span><span >1</span><span >&#41;</span><span >;</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" ><span >public</span> <span >class</span> MainClient <span >&#123;</span>
&nbsp;
	<span >public</span> <span >String</span>  traducirNumero<span >&#40;</span><span >int</span> numero<span >&#41;</span><span >&#123;</span>
		Traductor traductor <span >=</span> <span >null</span><span >;</span>
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;español&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorEspanol<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span>
&nbsp;
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;ingles&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorIngles<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span> 
&nbsp;
		<span >if</span> <span >&#40;</span>idioma.<span >equals</span><span >&#40;</span><span >&quot;aleman&quot;</span><span >&#41;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorAleman<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span>
		<span >String</span> toReturn traductor.<span >traducirNumero</span><span >&#40;</span>numero<span >&#41;</span><span >;</span>
                <span >return</span> toReturn<span >;</span>
	<span >&#125;</span><span >//traducirNumero</span>
     <span >public</span> <span >static</span> <span >void</span> main<span >&#40;</span><span >String</span> args<span >&#91;</span><span >&#93;</span><span >&#41;</span><span >&#123;</span>
          MainClient mc <span >=</span> <span >new</span> MainClient<span >&#40;</span><span >&#41;</span><span >;</span>
          <span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span>mc.<span >traducirNumero</span><span >&#40;</span><span >&quot;espanol&quot;</span>,<span >1</span><span >&#41;</span><span >&#41;</span><span >;</span>
     <span >&#125;</span>
<span >&#125;</span><span >//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" ><span >public</span> <span >class</span> TraductorFactory <span >&#123;</span>
     <span >public</span> TraductorFactory<span >&#40;</span><span >&#41;</span><span >&#123;</span>
&nbsp;
     <span >&#125;</span>
&nbsp;
	<span >public</span> <span >static</span> Traductor createTraductor<span >&#40;</span><span >int</span> numero<span >&#41;</span><span >&#123;</span>
		Traductor traductor <span >=</span> <span >null</span><span >;</span>
		<span >if</span> <span >&#40;</span>idioma<span >==</span><span >&quot;español&quot;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorEspanol<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span>
&nbsp;
		<span >if</span> <span >&#40;</span>idioma<span >==</span><span >&quot;english&quot;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorIngles<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span> 
&nbsp;
		<span >if</span> <span >&#40;</span>idioma<span >==</span><span >&quot;deutsch&quot;</span><span >&#41;</span><span >&#123;</span>
			traductor <span >=</span> <span >new</span> TraductorAleman<span >&#40;</span><span >&#41;</span><span >;</span>
		<span >&#125;</span>
		<span >return</span> traductor<span >;</span>
	<span >&#125;</span>
<span >&#125;</span><span >//de la clase</span></pre></div></div>

<p>¿Qué hace TraductorFactory? Simplemente elige, en base a los argumentos dados - 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" ><span >public</span> <span >class</span> MainClient <span >&#123;</span>
     <span >String</span> idioma<span >;</span>
     <span >public</span> <span >static</span> <span >void</span> main<span >&#40;</span>Strin <span >&#91;</span><span >&#93;</span>args<span >&#41;</span><span >&#123;</span>
		Traductor traductor <span >=</span> TraductorFactory.<span >createTraductor</span><span >&#40;</span><span >&quot;espanol&quot;</span><span >&#41;</span><span >;</span>
		<span >System</span>.<span >out</span>.<span >println</span><span >&#40;</span> traductor.<span >traducirNumero</span><span >&#40;</span><span >1</span><span >&#41;</span> <span >&#41;</span><span >;</span>
	<span >&#125;</span><span >//main</span>
&nbsp;
<span >&#125;</span><span >//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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/55/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oracle compra Sun…</title>
		<link>http://software.guisho.com/archives/41</link>
		<comments>http://software.guisho.com/archives/41#comments</comments>
		<pubDate>Tue, 21 Apr 2009 22:27:33 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/41/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Patrones de Diseño</title>
		<link>http://software.guisho.com/archives/38</link>
		<comments>http://software.guisho.com/archives/38#comments</comments>
		<pubDate>Tue, 21 Apr 2009 22:07:24 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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. [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/38/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Yo, diputado</title>
		<link>http://dd.guisho.com/yo-diputado</link>
		<comments>http://dd.guisho.com/yo-diputado#comments</comments>
		<pubDate>Thu, 18 Dec 2008 19:52:05 +0000</pubDate>
		<dc:creator>Inocencio</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<guid isPermaLink="false">http://www.diariodeundiputado.com/yo-diputado</guid>
		<description><![CDATA[	Nunca quise admitirlo, pero mi despido me dolió mucho, y me hizo una huella profunda. Intentaba dilucidar las razones y no las comprendía. Hice todo lo que había de hacerse: estudié, trabajé, hice lo que se me encomendó. Definitivamente esto del trabajo era injusto. Aquellos que sólo buscan sus ganancias siempre intentarán sacar lo mejor [...]]]></description>
			<content:encoded><![CDATA[<p>	Nunca quise admitirlo, pero mi despido me dolió mucho, y me hizo una huella profunda. Intentaba dilucidar las razones y no las comprendía. Hice todo lo que había de hacerse: estudié, trabajé, hice lo que se me encomendó. Definitivamente esto del trabajo era injusto. Aquellos que sólo buscan sus ganancias siempre intentarán sacar lo mejor de sus trabajadores, y eso simplemente no es correcto. </p>
<p>	Por azares del destino, un compañero de despido estaba muy metido en la política. Era parte de un nuevo partido de izquierda, el partido de dignidad nacional (PDN) cuyos postulados tenía mucho sentido. Pero sobre todo era el partido con más corazón: estaba dispuesto a elevar los impuestos para distribuir mejor la riqueza, era fiel precursor de la lucha por la educación pública en todos los sentidos, la salud pública y la ayuda al menos favorecidos. Muchas de sus ideas hicieron eco en todo el país. Proponían eliminar la educación y salud privadas de manera que todos comenzaran con las mismas oportunidades y de que las elevadas sumas que la gente pagaba en las instituciones privadas las absorbiera el gobierno para hacer un mejor uso de ellas. </p>
<p>	El auge del partido era grande. La población cada vez empobrecía más y las condiciones de vida en el país se deterioraban. Cuando entré no vi mucho lugar para mí. Sin embargo por alguna razón, tal vez ser de los pocos profesionales, me nombraron candidato a diputado. Fue algo que sucedió muy rápido. No estaba acostumbrado a las reuniones públicas, pero me gustaban. Me gustaba el respeto que la gente me daba. Además en el partido comencé a trabajar como asesor legal&#8230;.y me pagaban! Me pagaban incluso más que en mi anterior puesto. Afortunadamente pude rodearme de gente con corazón que deseaban un bien para el país, y yo era uno de sus representantes. </p>
<p>	Vinieron las elecciones. La tensión comenzó a crecer en mí. Lo gocé. Gracias al interior del país logré quedar como diputado. Mi asombro era mucho: era un representante del pueblo. Tenía un encargo que no sabía que podía tener. Sin tan ni son de repente yo, Inocencio Izquierdo, era diputado. De pronto comencé a tener muchos amigos, y muchas fiestas se hicieron a mi nombre. Yo no cabía de felicidad, pero nunca olvidé la responsabilidad que había caído sobre mí: el de representar a mi pueblo. Y digo que fue una responsabilidad que cayó sobre mí, porque yo no la elegí. Desde ese tiempo me volví creyente del destino. </p>
<p>	Y así, comencé mi vida política. </p>
]]></content:encoded>
			<wfw:commentRss>http://dd.guisho.com/yo-diputado/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Que quiero de mi capa de presentación?</title>
		<link>http://software.guisho.com/archives/29</link>
		<comments>http://software.guisho.com/archives/29#comments</comments>
		<pubDate>Tue, 16 Dec 2008 06:52:20 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/29/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Buscando gui</title>
		<link>http://software.guisho.com/archives/26</link>
		<comments>http://software.guisho.com/archives/26#comments</comments>
		<pubDate>Tue, 16 Dec 2008 06:40:06 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/26/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comenzando una empresa de software</title>
		<link>http://software.guisho.com/archives/21</link>
		<comments>http://software.guisho.com/archives/21#comments</comments>
		<pubDate>Mon, 08 Dec 2008 17:34:34 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></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>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/21/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Calidad del software</title>
		<link>http://software.guisho.com/archives/16</link>
		<comments>http://software.guisho.com/archives/16#comments</comments>
		<pubDate>Sun, 30 Nov 2008 00:15:27 +0000</pubDate>
		<dc:creator>guisho</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[posts]]></category>

		<category><![CDATA[sw]]></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 [...]]]></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/<br />
http://blog.xebia.com/2008/11/05/what-exactly-is-software-quality/<br />
http://en.wikipedia.org/wiki/Software_quality<br />
http://satc.gsfc.nasa.gov/support/STC_APR96/qualtiy/stc_qual.PDF<br />
http://en.wikipedia.org/wiki/ISO_9126<br />
http://www.bth.se/tek/besq.nsf/(WebFiles)/CF1C3230DB425EDCC125706900317C44/$FILE/chapter_1.pdf</p>
]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/archives/16/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
