viernes, 16 de marzo de 2012

Patrones de diseño en la programación orientada a objetos

Java
La programación orientada a objetos (POO) es un paradigma en la que los sistemas se diseñan mediante clases y relaciones entre ellas. Se utilizan conceptos como la herencia, polimorfismo, abstración, encapsulamiento y ocultación. Resumidamente estas propiedades son:
  • Clase: Abstracción que recoge las propiedades y comportamiento de los objetos en el sistema. Una clase puede instanciarse en objetos tantas veces como se necesite.
  • Objeto: instancia de una clase que se relaciona con el resto de objetos a través de los métodos definidos en sus clases.
  • Herencia: las clases no están aisladas y se relacionan entre ellas, mediante esta propiedad forman una jerarquía en la que las clases heredan las propiedades y métodos de las clases superiores.
  • Polimorfismo: es la propiedad de las instancias de las clases, los objetos, por la que pueden responder de forma diferente a un mismo nombre de método en función de su tipo concreto.
  • Abstracción: Permite modelar una entidad del ámbito de trabajo con las características relevantes para el sistema.
  • Encapsulamiento: los elementos relacionados se agrupan juntos en una misma clase para aumentar la cohesión.
  • Ocultación: las clases tienen una interfaz a través de la cual el resto de clases interactuan con ella de forma que no necesiten conocer sus detalles y evita que clases externas modifiquen el estado de manera inesperada.
Conocer estas propiedades es importante para programar en un lenguaje orietado a objetos sin embargo no es suficiente para diseñar sistemas que sean fáciles de mantener y que permitan adaptarse a nuevos cambios sin rediseñar los sistemas.

Aquí es donde aparecen los patrones de diseño y unos principios a la hora de diseñar los sistemas OO. Los patrones de diseño son formas identificadas que resuelve de forma correcta diferentes problemas comunes a algunos escenarios. Los principios son unas guías que dirigen el diseño que realizamos y que en gran medida están presentes en los patrones de diseño.

Muy resumidamente los patrones de diseño tienen como objetivo permitir hacer frente a toda constante que posee cualquier aplicación, el cambio, de tal forma que permitan escalar a los sistemas incorporando nuevas funcionalidades y prefiriendo añadir nuevo código a modificar código existente.

Algunos principios que deberían guiar nuestras decisiones son:
  • Encapsula lo que varía
  • Favorece la composición sobre herencia
  • Programa sobre interfaces, no implementaciones
  • Abierto a extensión, cerrado a cambio
  • Depende sobre abstracciones, no sobre clases concretas
  • Conocimiento solo de clase amigas
  • No nos llames, nosotros te llamaremos
  • Una clase debería tener solo una razón para cambiarla
  • Inversión de dependencias
Algunos patrones identificados y que resulven de forma correcta algunos problemas son:
Un muy buen libro que recoge todos estos principios y patrones es «Head First Design Patterns » y en el que se describe de forma más detallada y con ejemplos la aplicación de los principios y el uso de los patrones de una forma sencilla y bien explicada. Aunque es un libro con los ejemplos en Java es una lectura muy recomendada para cualquiera que quiera subir un nivel como desarrollador.


Después de leer el libro es buena idea tener una hoja de referencia con todos los patrones, en DZone hay una disponible que se puede descargar libremente design patterns cheat sheet. Si no quieres registrarte para descargarla usa Bug me not.

Referencia:
Programación orientada a objetos (Wikipedia)
Libro Head First - Desing Patterns de O'Reilly
Ejemplo del patrón de diseño Command y programación concurrente en Java
Ejemplo del patrón de diseño State
Ejemplo del patrón de diseño No Operation