<?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>Alfredo Juarez &#187; Ingenieria de Software</title>
	<atom:link href="http://www.alfrek.net/blog/category/programacion/ingenieria-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alfrek.net/blog</link>
	<description>Web Design and Development</description>
	<lastBuildDate>Fri, 03 Dec 2010 20:06:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Slide: Usabilidad en la Web</title>
		<link>http://www.alfrek.net/blog/2008/10/slide-usabilidad-web/</link>
		<comments>http://www.alfrek.net/blog/2008/10/slide-usabilidad-web/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 05:59:19 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[usabilidad]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=797</guid>
		<description><![CDATA[La usabilidad es un tema que no muchas empresas en MíƒÂ©xico toman en cuenta a la hora de diseíƒÂ±ar/desarrollar una aplicaciíƒÂ³n o un sitio Web. El Centro de Estudios de Usabilidad A.C nos presenta este Slide que habla acerca de los beneficios de la usabilidad, su lectura es altamente recomendable.]]></description>
			<content:encoded><![CDATA[<div id="__ss_83948" style="width: 425px; text-align: left;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=introduccin-a-la-usabilidad-web3765" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=introduccin-a-la-usabilidad-web3765" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>La usabilidad es un tema que no muchas empresas en MíƒÂ©xico toman en cuenta a la hora de diseíƒÂ±ar/desarrollar una aplicaciíƒÂ³n o un sitio Web. El Centro de Estudios de Usabilidad A.C nos presenta este Slide que habla acerca de los beneficios de la usabilidad, su lectura es altamente recomendable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/10/slide-usabilidad-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refactorización: una pequeña introducción</title>
		<link>http://www.alfrek.net/blog/2008/07/refactorizacion-una-pequena-introduccion/</link>
		<comments>http://www.alfrek.net/blog/2008/07/refactorizacion-una-pequena-introduccion/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:12:45 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[refactorizacion]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=480</guid>
		<description><![CDATA[Se trata de improvisar el diseño de un código existente. No estás agregando nuevas caracterí­sticas, solo estás moviendo, separando, combinando, eliminando y renombrando. Es una manera de mantener el código flexible para que éste siempre sea sencillo de mantener y agregar nuevas caracterí­sticas, aún y cuando crezca en complejidad. La refactorización reestructura la parte interna [...]]]></description>
			<content:encoded><![CDATA[<p>Se trata de improvisar el diseño de un código existente. No estás agregando nuevas caracterí­sticas, solo estás moviendo, separando, combinando, eliminando y renombrando. Es una manera de mantener el código flexible para que éste siempre sea sencillo de mantener y agregar nuevas caracterí­sticas, aún y cuando crezca en complejidad.<br />
La refactorización reestructura la parte interna del código fuente sin alterar su comportamiento externo. Mejor conocido como el proceso de limpiar el código, en ingenierí­a de software se usa a menudo como parte del desarrollo de software, de esta manera los desarrolladores alternan la inserción de nuevas funcionalidades y casos de prueba con la refactorización del código para mejorar su consistencia interna y su claridad.<br />
La refactorización es la parte del mantenimiento del código donde no se arregla errores ni se añade funcionalidad. El objetivo, por el contrario, es mejorar la facilidad de comprensión del código o cambiar su estructura y diseño, así­ como eliminar código muerto, para facilitar el mantenimiento en el futuro.<br />
Sin la refactorización, es fácil de entrar en una ví­a de un solo camino que guí­a directamente a la muerte del programa. Entre más pobre sea la estructura del código, más tendencias tienes a llegar a lo que se le llama â€œprogramación aproximadaâ€, es decir, se refiere al hecho que si no entiendes tu propio código, puedes seguir metiéndole cosas y moviéndole hasta que encuentres algo que funcione. Desafortunadamente, programación aproximada embrolla el código aún más y hace el trabajo más duras la próxima vez. Frecuentemente, terminarás con la necesidad de re-implementarlo todo.<br />
Hay muchas maneras conocidas y desconocidas de refactorización. Martin Fowler y otros nos han hecho el favor de catalogar un numero de técnicas de refactorización. El libro de Fowler Refactoring tiene instrucciones especí­ficas, paso a paso de cómo hacer cada uno de ellos.<br />
Pruebas automáticas son la clave de la refactorización. Ellos hacen posible probar el código entre cada paso pequeño en la refactorización. Hacer este tipo de pruebas repetidas manualmente puede ser por mucho una tarea que consume mucho tiempo. Así­ que, si no tienes pruebas automáticas, tu probarás el código hasta el final de la refactorización. Cuando finalmente empieces a probar, pudieras encontrar muchos bugs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/refactorizacion-una-pequena-introduccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DAO: Data Access Object</title>
		<link>http://www.alfrek.net/blog/2008/07/dao-data-access-object/</link>
		<comments>http://www.alfrek.net/blog/2008/07/dao-data-access-object/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 00:05:38 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=460</guid>
		<description><![CDATA[La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de [...]]]></description>
			<content:encoded><![CDATA[<p>La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de datos.</p>
<p>Para entenderlo mejor formularemos un ejemplo de la vida real.</p>
<p>Imaginemos que estamos desarrollando una aplicación en la empresa donde trabajamos y estamos utilizando MySQL como motor de base de datos. Estamos en la fase de pruebas (ya a punto de publicar el producto final), y por alguna extraña razón a tu jefe se le ocurre que mejor deberí­amos usar Oracle, por que se lo recomendaron, piensa que es mejor, etc.</p>
<p>Que pasa si tenemos todo mezclado (lógica del negocio, métodos de acceso a datos, etc),  se convierte en una tremenda pesadilla.</p>
<p>Para nuestra suerte existe el patrón de diseño Data Access Object (DAO), que se encarga de encapsular la interacción de una aplicación con la base de datos.</p>
<p><strong>Â¿Como funciona?</strong></p>
<p>DAO encapsula el acceso a la base de datos, de esta manera cuando la capa de lógica de negocio necesite interactuar con la base de datos, ésta utilizará los métodos ofrecidos por DAO. Generalmente la clase de operaciones que ofrece la capa de datos se le conoce como CRUD (Create, Read, Update y Delete).</p>
<p>Cuando la capa de negocios necesite almacenar datos (por ejemplo) solo tendrá que hacer referencia al método correspondiente para insertar los datos de la clase DAO, de esta manera si en algún momento se llegara a optar por usar otro motor de búsquedas, la capa del negocio no se debe preocupar ya que sólo bastará con actualizar la capa de datos. Si hablamos de patrones algunos detectarán por aquí­ que se están delegando responsabilidades, una buena práctica de la orientación a objetos.</p>
<p>De hecho el método de persistencia no debe de interesarle a la capa de negocios, es decir, a él no le importa si los datos se guardan en una tabla MySQL, XML, Texto plano o se imprime, de esto se encarga DAO.</p>
<p>Por cada tabla de una base de datos relacional existirá un DAO. Esto consiste básicamente en una clase que es la que interactúa con la base de datos. Los métodos de esta clase dependen de la aplicación y de lo que queramos hacer. Pero generalmente se implementan las 4 funciones básicas (también conocidas como métodos CRUD).</p>
<p>Una vez entendido el funcionamiento de DAO, es conveniente explicar un nuevo término que nos será de ayuda para completar la implementación de nuestra capa de persistencia. Se trata de los DTO&#8217;s (Data Transfer IObject), los cuáles son utilizados por DAO para transportar los datos desde la base de datos hasta la capa de lógica de negocio o vice versa.</p>
<p>En pocas palabras un DTO es un objeto que en su interior tiene como atributos los mismos atributos del modelo, con sus correspondientes accessors (Setters y Getters).</p>

<a href="http://www.alfrek.net/blog/wp-content/gallery/prueba/dao-diagram.png" title="" class="thickbox" rel="singlepic2" >
	<img class="ngg-singlepic" src="http://www.alfrek.net/blog/index.php?callback=image&amp;pid=2&amp;width=320&amp;height=240&amp;mode=watermark" alt="dao-diagram.png" title="dao-diagram.png" />
</a>

<p>Diagrama DAO</p>
<p><strong>Ahora veamos un ejemplo</strong></p>
<p>Tenemos una aplicación que entre una de sus tantas funciones es controlar los datos de  clientes, y queremos usar DAO para el manejo de la persistencia de dicha aplicación.<br />
Primero que nada de define el modelo 8en este caso de clientes), para después partir con la codificación de los respectivos DTO y DAO.</p>
<p><strong>DTO</strong></p>
<pre><code class="php"><span class="keyword">Class</span> ClientesDTO
{
      <span class="keyword">private</span> <span class="variable">$id</span>;
      prí­vate <span class="variable">$nombre</span>;
      prí­vate <span class="variable">$direccion</span>;

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getID( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;id;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getName( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;nombre;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getAddress( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;direccion;
      }

      <span class="comment">/* Setters */</span>
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setID( <span class="variable">$id</span> )
      {
          <span class="variable">$this</span>-&gt;id = <span class="variable">$id</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setName( <span class="variable">$name</span> )
      {
          <span class="variable">$this</span>-&gt;nombre = <span class="variable">$name</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setAddress( <span class="variable">$address</span> )
      {
          <span class="variable">$this</span>-&gt;direccion = <span class="variable">$address</span>;
      }
}</code></pre>
<p><strong>DAO</strong></p>
<pre><code class="php"><span class="keyword">class</span> clientesDAO
{
     <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> create( <span class="variable">$dto</span> )
     {
          <span class="comment">/* implementación para la creación de un nuevo registro */</span>
     }

      <span class="comment">/* aqui van los demás metodos CRUD */</span>
}</code></pre>
<p>Por obvias razones no escribí­ todo el código necesario ya que este artí­culo es meramente informativo, pero pienso que es explicito el ejemplo para comprender el uso del patrón DAO.<br />
En la próxima entrega les mostraré un ejemplo más real, utilizando una mezcla de patrones, como el DAO, Singleton, Factory y Faí§ade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/dao-data-access-object/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fases clasicas en la produccion de Software</title>
		<link>http://www.alfrek.net/blog/2008/05/fases-clasicas-en-la-produccion-de-software/</link>
		<comments>http://www.alfrek.net/blog/2008/05/fases-clasicas-en-la-produccion-de-software/#comments</comments>
		<pubDate>Wed, 07 May 2008 20:11:17 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[desarrollo de software]]></category>
		<category><![CDATA[fases de desarrollo]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=347</guid>
		<description><![CDATA[Â¿De que se compone el desarrollo de software? Hay un numero de fases comunes a cada desarrollo, sin importar la metodologí­a, empezando por la captura de requisitos y terminando por el mantenimiento. Con los nuevos paradigmas, en la otra mano, puedes realizar cada una de las fases mas de una vez en cualquier momento. Requisitos [...]]]></description>
			<content:encoded><![CDATA[<p>Â¿De que se compone el desarrollo de software? Hay un numero de fases comunes a cada desarrollo, sin importar la metodologí­a, empezando por la captura de requisitos y terminando por el mantenimiento. Con los nuevos paradigmas, en la otra mano, puedes realizar cada una de las fases mas de una vez en cualquier momento.</p>
<ul>
<li>Requisitos</li>
<li>Análisis</li>
<li>Diseño</li>
<li>Especificación</li>
<li>Implementación</li>
<li>Pruebas</li>
<li>Despliegue</li>
<li>Mantenimiento</li>
</ul>
<p><strong>Preguntas claves</strong></p>
<p><strong>Requisitos</strong><br />
Â¿Cual es nuestro contexto?<br />
Â¿Qué tratamos de adquirir?<br />
<strong></strong></p>
<p><strong>Análisis</strong><br />
Â¿Con que entidades estamos tratando?<br />
Â¿Cómo podemos estar seguros que hacemos lo correcto?<br />
<strong></strong></p>
<p><strong>Diseño</strong></p>
<p><strong></strong>Â¿Cómo vamos a resolver el problema?<br />
Â¿Qué hardware y/o software se necesitará para el sistema final?<br />
<strong></strong></p>
<p><strong>Diseño del subsistema</strong></p>
<p>Â¿Cómo vamos a implementar la solución?<br />
<strong></strong></p>
<p><strong>Especificación</strong></p>
<p>Â¿Qué reglas gobiernan entre las interfaces y los componentes del sistema?<br />
Â¿Podemos eliminar ambigí¼edades y asegurar lo correcto?<br />
<strong></strong></p>
<p><strong>Implementación</strong></p>
<p>Â¿Cómo programaremos las los componentes para completar los requisitos?<br />
Â¿Cómo escribimos código estilizado?<br />
<strong></strong></p>
<p><strong>Pruebas</strong></p>
<p>Â¿Satisface los requisitos?<br />
Â¿Podemos quebrar el sistema?<br />
<strong></strong></p>
<p><strong>Despliegue</strong></p>
<p>Â¿Qué tienen que hacer los administradores del sistema?<br />
Â¿Cómo podemos educar a los usuarios finales?<br />
<strong></strong></p>
<p><strong>Mantenimiento</strong></p>
<p>Â¿Podemos encontrar y resolver errores?<br />
Â¿Podemos mejorar el sistema?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/05/fases-clasicas-en-la-produccion-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>de Google y sus lineamientos de diseño</title>
		<link>http://www.alfrek.net/blog/2008/04/de-google-y-sus-lineamientos-de-diseno/</link>
		<comments>http://www.alfrek.net/blog/2008/04/de-google-y-sus-lineamientos-de-diseno/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 18:49:29 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[DiseÃ±o GrÃ¡fico]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Otros]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[design guidelines]]></category>
		<category><![CDATA[user experince]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=313</guid>
		<description><![CDATA[Jon wiley es un diseñador de experiencia al usuario en Google, el cuál ha mencionado 10 lineamientos que rigen el diseño de aplicaciones dentro de Google. Creo conveniente publicarlas por que así­ como le han servido de gran ayuda a Google, son lineamientos que todos deberí­amos seguir. 1. Useful: focus on people &#8211; their lives, [...]]]></description>
			<content:encoded><![CDATA[<p>Jon wiley es un diseñador de experiencia al usuario en Google, el cuál ha mencionado 10 lineamientos que rigen el diseño de aplicaciones dentro de Google. Creo conveniente publicarlas por que así­ como le han servido de gran ayuda a Google, son lineamientos que todos deberí­amos seguir.</p>
<blockquote><p>1. <span style="font-weight: bold;">Useful</span>: focus on people &#8211; their lives, their work, their dreams.<br />
2. <span style="font-weight: bold;">Fast</span>: every millisecond counts.<br />
3. <span style="font-weight: bold;">Simple</span>: simplicity is powerful.<br />
4. <span style="font-weight: bold;">Engaging</span>: engage beginners and attract experts.<br />
5. <span style="font-weight: bold;">Innovative</span>: dare to be innovative.<br />
6. <span style="font-weight: bold;">Universal</span>: design for the world.<br />
7. <span style="font-weight: bold;">Profitable</span>: plan for today&#8217;s and tomorrow&#8217;s business.<br />
8. <span style="font-weight: bold;">Beautiful</span>: delight the eye without distracting the mind.<br />
9. <span style="font-weight: bold;">Trustworthy</span>: be worthy of people&#8217;s trust.<br />
10. <span style="font-weight: bold;">Personable</span>: add a human touch.</p></blockquote>
<p>No se si tengan algún problema por dejarlos en inglés, pero para los que prefieran aqui les va en español:</p>
<ol>
<blockquote>
<li><strong>Usable</strong>: Enfócate en las personas &#8211; sus vidas, su trabajo, sus sueños.</li>
<li><strong>Rápido</strong>: cada milisegundo cuenta.</li>
<li><strong>Simple</strong>: simplicidad es poder.</li>
<li><strong>Acoplamiento</strong>: acopla a principiantes y atrae a los expertos.</li>
<li><strong>Inovador</strong>: Atrévete a ser inovador.</li>
<li><strong>Universal</strong>: diseña para el mundo.</li>
<li><strong>Provechoso</strong>: planea para el negocio de hoy y mañana.</li>
<li><strong>Hermoso</strong>: deleita al ojo sin distraer a la mente.</li>
<li><strong>Digno de confianza</strong>: sé digno con la confianza de la gente.</li>
<li><strong>Personal</strong>: agrega un toque humano.</li>
</blockquote>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/04/de-google-y-sus-lineamientos-de-diseno/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patrones de Diseño (Design Patterns)</title>
		<link>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/</link>
		<comments>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 01:18:12 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Otros]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[architect]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=10</guid>
		<description><![CDATA[&#8220;Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno y describe también el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin tener que hacer dos veces lo mismo.&#8221; Christopher Alexander Como habí­a quedado esta es la segunda entrega sobre arquitectura de software, [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">&#8220;Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno y describe también el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin tener que hacer dos veces lo mismo.&#8221;</span></p>
</blockquote>
<p class="MsoNormal" style="line-height: normal; text-align: right;"><em><span style="font-size: 12pt; font-family: " lang="ES">Christopher Alexander</span></em></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Como habí­a quedado esta es la segunda entrega sobre arquitectura de software, esta vez enfocada a los <strong>patrones de diseño</strong> los cuales describen un problema que ocurre en repetidas ocasiones en algún contexto determinado de desarrollo de software, y entregan una buena solución. Esto ayuda a diseñar correctamente en menos tiempo, evitando los errores que tan comúnmente se atribuyen a la etapa del diseño de software.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Un patrón de diseño es una solución a un problema que ya ha sido resuelto satisfactoriamente en ocasiones anteriores y a su vez puede ser reusable (aplicable a diferentes problemas de diseño en distintas circunstancias).<br />
Siendo estos la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Al dí­a de hoy es recomendable realizar un análisis, diseño e implementación orientado a objetos, a no ser que exista una excepción requerida por las circunstancias de la aplicación o campo en el que nos movemos.<br />
Para la parte de análisis y diseño se recomienda utilizar el Lenguaje de Modelado Unificado (<strong>UML</strong> por sus siglas en ingles).</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES"><strong>Análisis Orientado a Objetos</strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">En el análisis se estudia el dominio del problema para construir un modelo del mundo real utilizando objetos. Se investiga para hacer una descripción del problema y obtener todos los requerimientos necesarios.<br />
Se realiza una investigación del problema.<br />
Durante el Análisis, se enfatiza en encontrar y describir los objetos (o conceptos) en el dominio del problema.<em><br />
Por ejemplo: conceptos en un sistema de información para una librera incluyen Libros, Librerí­a.</em><br />
El í‰nfasis es en la investigación del problema y sus requisitos (mas que en una solución)<br />
Se resume en: Haz lo correcto (<strong>Do the Right Thing</strong>)<br />
<strong></strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES"><strong>Diseño Orientado a Objetos</strong></span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Se enfatiza una solución conceptual que satisface los requerimientos.<br />
Se necesita definir objetos software y como colaboran entre si para satisfacer los requerimientos.<br />
<em>Por ejemplo: en el sistema de información de una librerí­a el objeto software â€œlibroâ€ deberí­a tener un atributo â€œtituloâ€ y un método obtenerCapitulo();</em><br />
Diseños son implementados en un lenguaje de programación<br />
Se resume en; Haz las cosas bien. (<strong>Do the thing right</strong>)<br />
A pesar del esfuerzo realizado en las etapas anteriores surgen problemas debido al uso inapropiado de la orientación a objetos, una muy común es el mal empleo de la encapsulación.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Otro de los problemas fundamentales es el vacio que existe entre el análisis, diseño e implementación, que hace que el programador tenga la necesidad de tomar decisiones de diseño.</span></p>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Para solventar dichos problemas se produce un nuevo enfoque: el diseño con patrones. La idea fue propuesta inicialmente por el arquitecto Christopher Alexander, que aplica el concepto a la construcción de edificios en menos tiempo con la publicación de su libro <strong>&#8220;The TiÂ­meless Way of Building&#8221;</strong> en el año de 1979.<br />
No obstante, no fue hasta principios de los 90í¢â‚¬â„¢s cuando los patrones de diseño tuvieron gran í‰xito en el mundo de la informática a partir de la publicación del libro Design Patterns escrito por el GoF (Gang of Four) compuesto por Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides, en el que recogí­an 23 patrones de diseño comunes.</span></p>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: " lang="ES">Objetivos de los patrones</span></strong><span style="font-size: 12pt; font-family: " lang="ES"><br />
Los patrones de diseño pretenden:</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Proporcionar catálogos de      elementos reusables en el diseño de sistemas de software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Evitar la reiteración en la búsqueda      de soluciones a problemas ya conocidos y solucionados anteriormente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Formalizar un vocabulario común      entre diseñadores.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Estandarizar el modo en que se      realiza el diseño.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Facilitar el aprendizaje de las      nuevas generaciones de diseñadores condensando el conocimiento ya      existente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Sin embargo, no se pretende obligar      a utilizar los patrones de diseño siempre, solo en el caso de tener el      mismo problema o similar que soluciona el patrón, siempre teniendo en      cuenta que en un caso particular puede no ser aplicable. Abuzar o forzar      el uso de los patrones puede ser un error.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: " lang="ES">Clasificación de los patrones</span></strong><span style="font-size: 12pt; font-family: " lang="ES"><br />
Según la escala o nivel de abstracción:</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones arquitecturales:      Aquellos que expresan un esquema organizativo estructural fundamental para      sistemas software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Diseño: Aquellos que      expresan esquemas para definir estructuras de diseño (o sus relaciones)      con las que construir sistemas software.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Idiomas: Patrones bajo nivel especí­ficos      para un lenguaje de programación o entorno concreto.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Según el propósito: Qué hace el patrón.</span></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Creación: para creación      de instancias.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones estructurales:      relaciones entre clases, combinación y formación de estructuras mayores.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Patrones de Comportamiento: Interacción      y cooperación entre clases.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones Creacionales</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Abstract Factory (Fábrica      abstracta): Permite trabajar con objetos de distintas familias de manera      que las familias no se mezclen entre sí­Â­ y haciendo transparente el tipo      de familia concreta que se esté usando.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Builder (Constructor virtual):      Abstrae el proceso de creación de un objeto complejo, centralizando dicho      proceso en un íšnico punto.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Factory Method (Método de fabricación):      Centraliza en una clase constructora la creación de objetos de un subtipo      de un tipo determinado, ocultando al usuario la casuí­stica para elegir el      subtipo que crear.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Prototype (Prototipo): Crea      nuevos objetos cloníndolos de una instancia ya existente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Singleton (Instancia íšnica):      Garantiza la existencia de una íšnica instancia para una clase y la creación      de un mecanismo de acceso global a dicha instancia.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones Estructurales</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Adapter (Adaptador): Adapta una      interfaz para que pueda ser utilizada por una clase que de otro modo no podrá      utilizarla.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Bridge (Puente): Desacopla una abstracción      de su implementación.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Composite (Objeto compuesto):      Permite tratar objetos compuestos como si de uno simple se tratase.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Decorator (Envoltorio): Añade      funcionalidad a una clase dinámicamente.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Facade (Fachada): Provee de una      interfaz unificada simple para acceder a una interfaz o grupo de      interfaces de un subsistema.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Flyweight (Peso ligero): Reduce      la redundancia cuando gran cantidad de objetos poseen idéntica información.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Proxy: Mantiene un representante      de un objeto.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Patrones de Comportamiento</span></strong></p>
<ul type="disc">
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Chain of Responsibility (Cadena      de responsabilidad): Permite establecer la lí­nea que deben llevar los      mensajes para que los objetos realicen la tarea indicada.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Command (Orden): Encapsula una operación      en un objeto, permitiendo ejecutar dicha operación sin necesidad de      conocer el contenido de la misma.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Interpreter (Intérprete): Dado un      lenguaje, define una gramática para dicho lenguaje, así­Â­ como las      herramientas necesarias para interpretarlo.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Iterator (Iterador): Permite      realizar recorridos sobre objetos compuestos independientemente de la implementación      de estos.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Mediator (Mediador): Define un      objeto que coordine la comunicación entre objetos de distintas clases,      pero que funcionan como un conjunto.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Memento (Recuerdo): Permite      volver a estados anteriores del sistema.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Observer (Observador): Define una      dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto      cambie de estado se notifique y actualicen automáticamente todos los      objetos que dependen de í‰l.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">State (Estado): Permite que un      objeto modifique su comportamiento cada vez que cambie su estado interno.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Strategy (Estrategia): Permite      disponer de varios métodos para resolver un problema y elegir cuál      utilizar en tiempo de ejecución.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Template Method (Método      plantilla): Define en una operación el esqueleto de un algoritmo,      delegando en las subclases algunos de sus pasos, esto permite que las      subclases redefinan ciertos pasos de un algoritmo sin cambiar su      estructura.</span></li>
<li class="MsoNormal" style="line-height: normal;"><span style="font-size: 12pt; font-family: " lang="ES">Visitor (Visitante): Permite      definir nuevas operaciones sobre una jerarquí­a de clases sin modificar las      clases sobre las que opera.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;">
<h1><span lang="ES-TRAD">Conclusiones</span></h1>
<p class="MsoNormal"><span lang="ES">La idea de los patrones ha adquirido gran popularidad. En el ámbito de la ingenierí­a de software; se están desarrollando muchos proyectos de investigación al respecto. No sólo se están aplicando en los llamados patrones de diseño, sino que la idea esta transportándose a otras actividades del desarrollo de software. </span></p>
<p class="MsoNormal"><span lang="ES">El concepto de patrón tiene carácter general y por consiguiente es aplicable a un sin número de situaciones de diferentes tipo, estilo, entorno, etc. En lo referente al software, la aplicación de los patrones esta siendo utilizada con éxito en muchos ámbitos de la ingenierí­a de software. En definitiva está mejorando las prácticas en el desarrollo de sistemas de información.</span></p>
<p class="MsoNormal"><span lang="ES">Donde exista la posibilidad de aplicación del criterio profesional experimentado, a un problema recurrente, la idea de patrones de Alexander podrá usarse para reutilizar y transmitir dichas experiencias a profesionales menos experimentados. </span></p>
<p class="MsoNormal"><span lang="ES">Por lo tanto podemos resumir un patrón con los siguientes puntos:</span></p>
<ul style="margin-top: 0cm;" type="disc">
<li class="MsoNormal"><span lang="ES">Un Patrón de      Diseño, es un conjunto de información que describe una solución recurrente      a un problema de diseño no trivial. </span></li>
<li class="MsoNormal"><span lang="ES">La efectividad de      esta solución ha debido ser probada muchas veces por profesionales      expertos dentro de un contexto determinado en situaciones anteriores. </span></li>
<li class="MsoNormal"><span lang="ES">Esta solución debe      ser reutilizable, para problemas de diseño similares en distintas      circunstancias. </span></li>
<li class="MsoNormal" style="margin-bottom: 0.0001pt;"><span lang="ES">Esta descripción de un patrón debe ser lo suficientemente      explí­cita para que pueda ser transmitida a profesionales no      expertos&#8221;.</span></li>
</ul>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 18pt; font-family: ">Bibliografí­a</span></strong></p>
<p class="MsoNormal" style="line-height: normal;"><strong><span style="font-size: 12pt; font-family: ">Design Patterns. Elements of Reusable Object-Oriented Software</span></strong><span style="font-size: 12pt; font-family: "> &#8211; Gamma, Helm, Johnson, Vlissides &#8211; Addison Wesley<br />
<strong>UML y Patrones. </strong></span><strong><span style="font-size: 12pt; font-family: " lang="ES">Introducción al análisis y diseño orientado a objetos</span></strong><span style="font-size: 12pt; font-family: " lang="ES"> &#8211; Larman &#8211; Prentice Hall<br />
<strong>Patrones de diseño</strong> &#8211; Wikipedia</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2007/07/patrones-de-diseno-design-patterns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

