Mi granito de java: Patrones de Diseño de GOF

jueves, 9 de junio de 2011

Patrones de Diseño de GOF

Los patrones de diseño son una pieza fundamental en el desarrollo del software. En mi opinión un desarrollador senior debería conocerlos. No todos, pero si los más importantes. Al ser algo estándar, permiten hablar un lenguaje común entre un equipo de desarrollo; por ende, si un junior también los conoce puede ser muy beneficioso, ya que estaría hablando en el mismo lenguaje de una persona con más experiencia. Empecemos por explicar el concepto de un patrón:

“Un patrón describe un problema el cual ocurre una y otra vez en nuestro ambiente, y además describen el núcleo de la solución a tal problema, en tal una manera que puedes usar esta solución millones de veces, sin hacer lo mismo dos veces.” [Alexander et al.].
Aunque Alexander se refería a patrones en ciudades y edificios, lo que dice también es válido para patrones de diseño orientados a objetos.

Los patrones de diseño tratan los problemas del diseño de software que se repiten y que se presentan en situaciones particulares, con el fin de proponer soluciones a ellas. Son soluciones exitosas a problemas comunes.

Estas soluciones han ido evolucionando a través del tiempo. Existen muchas formas de implementar patrones de diseño. Los detalles de las implementaciones se llaman estrategias.
En resumen, son soluciones simples y elegantes a problemas específicos del diseño de software orientado a objetos.


Un poco de Historia


En 1994 se publicó el libro "Design Patterns: Elements of Reusable Object Oriented Software" escrito por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Ellos recopilaron y documentaron 23 patrones de diseño aplicados usualmente por expertos diseñadores de software orientado a objetos. Ellos no fueron los únicos que inventaron los patrones, pero la idea de patrones de diseño comenzó a tomar fuerza luego de la publicación de dicho libro.



Que es gof.


Los ahora famosos Gang of Four (GoF, que en español es la pandilla de los cuatro) formada por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Son los autores del famoso libro "Design Patterns: Elements of Reusable Object Oriented Software".


Aquí una breve reseña de los autores:


Erich Gamma, informático suizo, es actualmente el director del centro tecnológico OTI en Zúrich y lidera el desarrollo de la plataforma Eclipse. Fue el creador de JUnit, junto a Kent Beck.


Richard Helm trabaja actualmente con The Boston Consulting Group, donde se desempeña como consultor de estrategias de IT aplicadas al mundo de los negocios.
Su carrera abarca la investigación de distintas tecnologías, desarrollo de productos, integración de sistemas y consultoría de IT. Antes de incorporarse a BCG, Richard trabajó en IBM: comenzó su carrera como científico investigador en "IBM Thomas J. Watson Research Center" en Nueva York. Es una autoridad internacional en arquitectura y diseño de software.

Ralph E. Johnson es profesor asociado en la Universidad de Illinois, en donde tiene a su cargo el Departamento de Ciencias de la Computación. Co-autor del famoso libro de Gof y pionero de la comunidad de Smalltalk, lidera el UIUC patterns/Software Architecture Group.

John Vlissides (1961-2005) era ingeniero eléctrico y se desempeñaba como consultor de la Universidad de Standford. Autor de muchos libros, desde 1991 trabajó como investigador en el "IBM T.J. Watson Research Center".


Cuando utilizar los patrones de diseño.

Como analistas y programadores vamos desarrollando a diario nuestras habilidades para resolver problemas usuales que se presentan en el desarrollo del software. Por cada problema que se nos presenta pensamos distintas formas de resolverlo, incluyendo soluciones exitosas que ya hemos usado anteriormente en problemas similares.


Antes de comenzar nuestro diseño, deberíamos realizar un estudio meticuloso del problema en el que nos encontramos y explorarlo en busca de patrones que hayan sido utilizados previamente con éxito. Estos patrones nos ayudarán a que nuestro proyecto evolucione mucho más rápidamente.


Cuando no utilizarlos.


Si hay una sensación que describa lo que puede sentir un desarrollador o diseñador después de conocer los patrones de diseño esa podría ser la euforia. Esta euforia viene producida por haber encontrado un mecanismo que convierte lo que era una labor artesana y tediosa, en un proceso sólido y basado en estándares, mundialmente conocido y con probado éxito.


Después de recién iniciarse en los patrones, probablemente el paso siguiente que tomará será emprender el rediseño de algunos proyectos aún vigentes y que intente aplicar todas las maravillosas técnicas que ha aprendido para que así estos proyectos se aprovechen de todos los beneficios inherentes al uso de patrones de diseño.


Esto termina en intentar que se aplique estos patrones en toda situación donde sea posible, aún en aquellas donde no deba aplicarse.


Donde utilizarlos.


No es obligatorio utilizar los patrones siempre, sólo 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. Abusar o forzar el uso de los patrones es un error muy común.


Antes de abordar un proyecto con patrones se debe analizar minuciosamente qué patrones nos pueden ser útiles, cuáles son las relaciones entre los diferentes componentes de nuestro sistema, cómo podemos relacionar los patrones entre sí de modo que formen una estructura sólida, cuáles son los patrones que refleja nuestro dominio, etc. Esta tarea obviamente es mucho más compleja que el mero hecho de ponerse a codificar patrones "porque sí".


Beneficios.

  • Proporcionan elementos reusables en el diseño de sistemas software, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.
  • Efectividad comprobada en la resolución de problemas similares en ocasiones anteriores.
  • Formalizan un vocabulario común entre diseñadores.
  • Estandarizan el diseño, lo que beneficia notablemente a los desarrolladores.
  • Facilitan el aprendizaje de las nuevas generaciones de diseñadores y desarrolladores utilizando conocimiento ya existente.
Tipos de patrones.
Verán en casi todas las bibliogafrías que hay una clasificación de tipos de patrones. Los patrones tienen dos tipos de clasificaciones:


1) Clasificación según su propósito

Creacionales: definen la mejor manera en que un objeto es instanciado. El objetivo de estos patrones es de abstraer el proceso de instanciación y ocultar los detalles de cómo los objetos son creados o inicializados.
De Comportamiento: permiten definir la comunicación entre los objetos del sistema y el flujo de la información entre los mismos.
Estructurales: permiten crear grupos de objetos para ayudarnos a realizar tareas complejas.

2) Clasificación según alcance

De clase: se basados en la herencia de clases.
De objeto: se basan en la utilización dinámica de objetos.



Propósito
De CreaciónEstructuralDe Comportamiento
AlcanceClaseFactory MethodAdapterInterpreter
Template Method
ObjetoAbstract FactoryAdapterChain of Responsability
BuilderBridgeCommand
PrototypeCompositeIterator
SingletonDecoratorMediator
FacadeMemento
FlyweightObserver
ProxyState
Strategy
Visitor


Por último...


Cuando quise aprender a utilizar los patrones de diseño me encontré con una pobre documentación en la web: vagos ejemplos; lenguajes que no conocía, indioma inglés y casos mal explicados. Esto me llevo a escribir un manual de patrones de diseño que hoy en día se usa en un instituto educativo para dictar un curso sobre dichos patrones. Por esta razón, hoy he adaptado y modificado este libro para publicar dichos ejemplos en el blog.
Tengo que dejar algo bien en claro antes de abordar con  los patrones en sí. Daré ejemplos de cada uno de ellos, pero esto no quiere decir que es la única forma de hacerlo. Los patrones pueden adaptarse a nuestras necesidades: no lo tomen como algo rígido. Por ejemplo, si se necesita adaptar un poco un patrón para que me pueda ayudar en una solución, que así sea.

12 comentarios:

Anónimo dijo...

Lo mejor que encontre en la web

Anónimo dijo...

lejos

Max dijo...

Muchas gracias!

Anónimo dijo...

Como ya han dicho antes... de lo mejor que he encontrado en la web respecto de este tema, muchas gracias por tu granito de java

Anónimo dijo...

Gracias, Excelentes tus comentarios, me han servido mucho para iniciar mi aprendizaje en el tema.

Jacuper

Anónimo dijo...

Después de terminar de leerme todos los patrones de creacion, me parece de justicia darte las gracias por la enorme a portación que has hecho.

Muchísimas gracias y encima con ejemplos en java, loq ue más me gusta

Max dijo...

Muchas gracias por los comentarios!

Anónimo dijo...

Es una Excelente página, pues es bien clara en lo que expone, de verdad muchas gracias.

Anónimo dijo...

Muuuy buen y excelente aporte!! La verdad me sirvió mucho y teneis razón en que vienen mal explicados en la red, me gustó mucho Felicidades y Gracias por el aporte.. nos sirve para los que nos gusta sobre este tema...

Anónimo dijo...

La verdad es que se nota cuando algunos crean publicaciones haciendo copy-paste.
Esto definitivamente está pensado por el autor, expresando los conceptos de forma clara y correcta.
Felicitaciones y muchas gracias por la dedicación y el aporte.
Muy buen laburo!!!

Max dijo...

Muchas gracias por los buenos comentarios!!

Anónimo dijo...

Buenisimo, con ejemplos muy claros! gracias por hacer esto!