Patrones de diseño I

32
Patrones de Diseño Imagemaker IT Agosto, 2011 os constructores hicieran las casas de la misma forma en que los Desarrollad criben código, El primer pájaro carpintero que viniera destruiría la civilizació Stephen Stelting, Olav Maassen.

Transcript of Patrones de diseño I

Page 1: Patrones de diseño I

Patrones de Diseño

Imagemaker IT

Agosto, 2011

“Si los constructores hicieran las casas de la misma forma en que los Desarrolladores escriben código, El primer pájaro carpintero que viniera destruiría la civilización.”

Stephen Stelting, Olav Maassen.

Page 2: Patrones de diseño I

Temario• Introducción• Historia• ¿Qué es un patrón de diseño?• Características• Conceptos Básicos• Por qué usar patrones• Tipos de patrones• Plantilla de Patrones• ¿De que me sirve usar patrones de diseño?• Como seleccionar y usar un patrón• Reutilización• Ejemplo

Page 3: Patrones de diseño I

Introducción

• “Diseñar software orientado a objetos es difícil, y diseñar software orientado a objetos

reutilizable es todavía más difícil” – Capítulo 1 introducción - Design Patterns, The

Gang of Four.• Diseñar para el cambio.• Anticiparse a los cambios en los requisitos o

variantes, diseñando de forma tal, que nuestro software se adapte a distintas situaciones.

Page 4: Patrones de diseño I

Introducción

• El objetivo del diseño de software es llegar a un producto de calidad.• El diseño debe ser adecuado para la aplicación en

particular, pero dicha solución también debe ser general para poder enfrentar distintos escenarios y evitar el rediseño.

• No es necesario partir desde cero.

Page 5: Patrones de diseño I

Historia• La idea de patrón de diseño que utilizamos en

Ingeniería de Software viene de la arquitectura. En 1977 se publicó “A Pattern language: Towns/Building/Construction” de Christopher Alexander y otros.

• Según Alexander, cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo siquiera dos veces de la misma forma”.

Page 6: Patrones de diseño I

Historia• Los patrones de diseño de software nacen en los 80’s con Kent Beck y Ward Cunningham,

que discutían patrones para Smalltalk.• La contribución más célebre es el libro “Patrones

de Diseño” de Erick Gamma, Richard Helm, Ralph Johnson y John Vlissides con ejemplos en C++, la famosa Gof (Gang of Four).

Page 7: Patrones de diseño I

¿Qué es un patrón de Diseño?• Según Dirk Riehle y Heinz Zullighoven: “Un patrón es la abstracción de una forma concreta que puede repetirse en contextos específicos.”• Para Christopher Alexander: “Cada patrón describe un

problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo ni siquiera dos veces de la misma forma”.

Page 8: Patrones de diseño I

Características• Soluciona un problema: buscan solucionar problema concreto y recurrente.• Es un concepto probado: son soluciones

demostradas, no teorías ni especulaciones.• La solución no es obvia: muchas técnicas de solución

de problemas tratan de hallar soluciones por medio de principios básicos. Los mejores patrones generan una solución a un problema de forma indirecta.

• Describe participantes y relaciones entre ellos: No solo describen módulos sino estructuras y mecanismos complejos. Y por supuesto, como se relacionan para lograr su objetivo.

Page 9: Patrones de diseño I

Características

• Repetición, adaptabilidad y utilidad: si no se repite, no es un patrón, pero además de esto debe demostrar su adaptabilidad y utilidad en al menos 3 sistemas existentes. Explicando como el patrón es exitoso; y mostrar la utilidad detallando porque es beneficioso.

Page 10: Patrones de diseño I

Conceptos Básicos• Nombre: nombre descriptivo del patrón.• También conocido como: nombre alternativo si lo hay.• Propiedades según 2 aspectos: Tipo (Creación,

comportamiento, estructural, de sistema) y Nivel (Clase única, componente, arquitectónico).

• Propósito: explicación de las implicaciones del patrón.• Presentación: descripción del problema que permite

enfrentar.• Aplicabilidad: cuando y por qué sería deseable su utilización.• Descripción: explicación detallada del patrón, indicando que

hace y cómo se comporta.• Implementación: explicación de qué debe hacerse para

implementar este patrón.

Page 11: Patrones de diseño I

Conceptos Básicos

• Ventajas e Inconvenientes: consecuencias del uso del patrón y los compromisos asociados al uso del mismo.• Variantes: posibles implementaciones alternativas y

variaciones del patrón.• Patrones Relacionados: otros patrones con los que está

asociado o con los que tiene relación estrecha.• Ejemplo: Un ejemplo en un lenguaje de programación

determinado.

Page 12: Patrones de diseño I

Por qué Usar Patrones de Diseño

• Porque su utilización y documentación permite a desarrolladores novatos beneficiarse

de la experiencia de soluciones anteriores.• Proporcionan un vocabulario común a los

desarrolladores, mejorando la comunicación de soluciones entre ellos.

• Al tener conocimiento sobre patrones, logramos mejores diseños ya que sabemos de antemano los pros y contras que pueda tener una solución planteada.

Page 13: Patrones de diseño I

• Las soluciones con patrones resuelven problemas específicos hacen los diseños OO más

flexibles, elegantes y reutilizables. • Al recoger la experiencia de problemáticas

anteriores, partimos con una buena base para enfrentar el nuevo desafío.

Por qué Usar Patrones de Diseño

Page 14: Patrones de diseño I

Por qué Usar Patrones de Diseño• Facilitan la reutilización de diseños y arquitecturas de software que han tenido éxito ó buen comportamiento/rendimiento.• Ayudan a comprender mejor un sistema cuando está documentado con los patrones que se utilizaron en su desarrollo.• Facilitan la reestructuración de un sistema.• Al estar orientados al cambio, permite adaptarse más rápido y de mejor forma a las modificaciones que se dan en los sistemas durante un período de tiempo.

Page 15: Patrones de diseño I

Tipos de Patrones

• Patrones de arquitectura: expresa una organización o esquema estructural fundamental

para sistemas software. Proporciona un conjunto de subsistemas predefinidos, especifica sus responsabilidades, e incluye una guía para organizar las relaciones entre ellos.

• Patrones de Diseño: proporciona un esquema para refinar los subsistemas o componentes de un sistema software, o las relaciones entre ellos. Describe estructuras repetitivas de comunicar componentes que resuelven un problema de diseño en un contexto particular.

Page 16: Patrones de diseño I

Tipos de Patrones

• Patrones de programación: Describe como implementar aspectos de componentes o de las relaciones entre ellos utilizando las facilidades del lenguaje de programación dado.

• Patrones de análisis: describen un conjunto de prácticas que aseguran la obtención de un buen modelo de un problema y su solución.

• Patrones organizacionales: describen la estructura y prácticas de las organizaciones humanas, especialmente en las que producen, usan o administran software.

Page 17: Patrones de diseño I

Tipos de Patrones de Diseño

• Patrones de Creación: Muestran la guía de cómo crear objetos cuando esta labor requiere tomar decisiones.

Estas normalmente serán resueltas dinámicamente decidiendo que clases instanciar o sobre qué objetos se delegarán las responsabilidades.

• Patrones de Partición: durante el análisis, se examina el problema para identificar actores, casos de uso, requerimientos y sus relaciones. Estos patrones proveen la guía de cómo dividir actores complejos y casos de múltiples clases.

Page 18: Patrones de diseño I

Tipos de Patrones de Diseño• Patrones de Comportamiento: Son utilizados para organizar, manejar y combinar el comportamiento que

tendrán los objetos en el contexto de nuestra solución.

• Patrones Estructurales: Describen las formas comunes en que diferentes tipos de objetos pueden ser organizados para trabajar unos con otros.

• Patrones de concurrencia: permiten coordinar operaciones concurrentes y están dirigidos a 2 tipos principales de problemas: Recursos compartidos y secuencia de operaciones.

Page 19: Patrones de diseño I

Catálogo de Patrones

Page 20: Patrones de diseño I

¿De que me sirve usar patrones de diseño?

• Determinar Granularidad: los objetos pueden variar en tamaño y número. Se debe decidir qué será un

objeto y que no.• Especificar las interfaces: Son el conjunto de signatures o

firmas de las operaciones de un objeto. Los patrones nos ayudan a definir estas interfaces, incluso indican que no poner en la interface.

• Determinar los tipos: El tipo es el nombre utilizado para denotar una interface. Un objeto es de un tipo si acepta todas las operaciones indicadas en su interface. Los patrones nos ayudan a determinar estos tipos y analizar las relaciones que tendrán entre ellas.

Page 21: Patrones de diseño I

• Obligan a programar para la interface, NO a la implementación.

• Con una herencia bien utilizada podemos definir familias de objetos con interfaces idénticas• Si la herencia es usada correctamente, todas las

clases derivadas de una clase abstracta comparten la misma interface, es decir, responden a los mismos mensajes.

Page 22: Patrones de diseño I

Como seleccionar y usar un patrón

• Considerar los problemas de diseño: seleccionar los patrones que lo resuelvan.• Observar la intención del patrón: escoger los más cercanos al

problema. • Estudiar como se interrelacionan los patrones: quizás haya

que usar más de uno.• Estudiar los patrones de propósito similar: esto es para

comparar posibles soluciones.• Estudiar posibles causas de rediseño: Tener en cuenta las

que evitan los patrones.• Considerar variabilidad en el diseño: para anticiparse al

cambio.

Page 23: Patrones de diseño I

• Leer todo el patrón más de una vez: obtener una visión global, especialmente de la aplicabilidad y consecuencias del uso.• Definir las clases de los patrones escogidos: Escoger los nombres,

que deben ser representativos en el contexto de la aplicación.• Definir nombres de las operaciones: ser consistente.• No Intentar aplicar un patrón a la fuerza: Esto es de suma

relevancia, ya que la utilización de un patrón debe ser el resultado de un análisis a conciencia, y su aplicabilidad un proceso natural, considerando matices, pero no forzando su uso.

Page 24: Patrones de diseño I

Mecanismos de Reutilización

• Usualmente la herencia es vista como el mecanismo de reutilización en orientación a objetos.

• Aún así, existe otra técnica alternativa llamada composición de objetos. En ella se obtiene una nueva funcionalidad ensamblando o componiendo objetos. Y para ello es necesario, que dichos objetos posean interfaces bien definidas.

• Ambas tienen sus ventajas y desventajas que veremos a continuación.

Herencia vs. Composición

Page 25: Patrones de diseño I

Ventajas de la Herencia

• Queda definida en tiempo de compilación y es sencilla de usar.• El lenguaje que usamos le da sustento.• Es más fácil de modificar si se necesita para reutilizar.

Desventajas de la Herencia

• No se puede cambiar la implementación de lo heredado en tiempo de ejecución

• Como la clase padre implementa parte de la estructura de la clase hija, ésta expone detalles a sus herederos.

• Las clases padre e hija están íntimamente relacionadas. Un cambio en la clase padre, provoca un cambio en la clase hija.

Page 26: Patrones de diseño I

Composición

• La composición de objetos se define en tiempo de ejecución, por medio de objetos que tienen referencias a otros

objetos.

Ventajas de la Composición

• Como los objetos solo se acceden por medio de las interfaces, no se quiebra el encapsulamiento. Por esto, las interfaces deben ser cuidadosamente diseñadas.• Los objetos pueden ser reemplazados en tiempo de ejecución,

siempre y cuando posean la misma interface.• La implementación de un objeto se escribe en términos de

interfaces lo que reduce las dependencias de implementación.• Lema de orientación a objetos: “Favorecer la composición de

objetos por sobre la herencia”.

Page 27: Patrones de diseño I

Delegación• La delegación es la técnica que le da poder a la composición de objetos.• En delegación, 2 objetos están involucrados en atender un

mensaje ó pedido: un objeto receptor que recibe el mensaje y lo deriva en el objeto delegado.

Ventajas de la composición• Es fácil combinar comportamiento en tiempo de ejecución y

cambiar la manera en que estos se combinan.

Desventaja• El software dinámico y parametrizable es difícil de entender.

Page 28: Patrones de diseño I

Singleton• Tipo: creación• Nivel: Objeto• Propósito: Permite tener una única instancia de esta clase en el sistema, a

la vez que permite que todas las clases tengan acceso a esa instancia.• Aplicabilidad: Usar cuando se quiera solo una instancia de una clase, pero

debe estar disponible globalmente.• Descripción: Este patrón asegura que se crea un máximo de una instancia

en la JVM. Para asegurar que se tiene el control sobre esta instanciación, se debe hacer el constructor privado. Dado lo anterior, es imposible crear una instancia, por lo que se debe proporcionar un método estático getInstance() para acceder a una instancia de esa clase, la que será creada siempre y cuando no haya sido creada con anterioridad, en cuyo caso, devuelve dicha instancia, la que ha sido almacenada como un atributo privado de la clase.

Page 29: Patrones de diseño I

• Implementación:

Ventajas e Inconvenientes:• La clase Singleton es la única clase que puede crear una instancia de sí

misma. No se puede obtener ninguna instancia sin utilizar el método estático proporcionado.

• No necesita pasar la referencia a todos los objetos que acceden al Singleton.

• Sin embargo, este patrón puede presentar problemas de acceso multithread, dependiendo de cómo se haya realizado la implementación.

Page 30: Patrones de diseño I

Variaciones• Una de las opciones más exploradas del patrón Singleton, es tener más de una instancia dentro de la clase. La ventaja es que el resto de la aplicación puede permanecer

inalterada, mientras que todos aquellos objetos que conocen la existencia de múltiples instancias pueden utilizar algún método para obtener una de las otras instancias.

• El método de acceso al Singleton puede ser el punto de entrada al conjunto total de instancias, aunque todas tengan un tipo distinto. Este puede determinar, en tiempo de ejecución, que tipo de instancia devolver. Esto podría parecer extraño, pero es muy útil cuando se utiliza carga dinámica de clases.

Patrones Relacionados• Abstract Factory• Builder• Prototype

Page 31: Patrones de diseño I

• Ejemplo:

package cl.bch.ejemplo;

/** * Clase de ejemplo con la implementación de un Singleton * @author sergio * */public class ClassicSingleton {

//Instancia donde almacenaremos la instanciaprivate static ClassicSingleton instance= null;

//Constructor privadoprivate ClassicSingleton() { // Exists only to defeat instantiation.}

/** * Metodo con el cual devolvemos la instancia solicitada de la clase * @return */public static ClassicSingleton getInstance() { if(instance == null) { instance = new ClassicSingleton(); } return instance;}

}

Page 32: Patrones de diseño I

Gracias… Totales!