Daniel Mazzini Ubica Solutions

Slides:



Advertisements
Presentaciones similares
MODELOS ORIENTADOS A OBJETOS
Advertisements

U.M.L A/Gx. Diego Gutiérrez Application Analysis and Design.
Curso de java básico (scjp)
Red Social: “Un millón de Amigos”.
Fundamentos de Diseño de Software INFT.1
Observador (observer) Visita (Visitor) Singleton
FACHADA COMPOSITOR MEMENTO
Tomado de:
FACHADA.
Arquitectura de software dirigida por modelos (Model-Driven Architecture) Liliana Favre UNCPBA 2006.
Programación Orientada a Objetos
Patrones de Diseño GEYFFER ALEXANDER ACOSTA CRISTHIAN DOUGLAS CASTRO
Tipo de Dato Abstracto Tipos de datos:
Aplicación del paradigma orientado a objetos
INTRODUCCIÓN A UML Oscar Miguel Alonso Moreno.
Ingeniería del Software
Encapsulamiento y Abstracción
PROGRAMACIÓN EN JAVA Curso-taller inicial de programación en JAVA Facultad de Estadística e Informática TEMA II.
Unified Modeling Language (Lenguaje de Modelamiento unificado)
Análisis y Diseño orientado a objetos con UML.
Profesor: Miguel Angel Vidal
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Conceptos Objeto Clase Atributo / Método Encapsulamiento Mensaje
Tema 10: Interfaces Antonio J. Sierra.
Contexto: Aplicación gráfica.  Siempre que se piensa en separar la funcionalidad de una aplicación de su interacción con el usuario, bien sea una aplicación.
Diseño de Sistemas. Patrones de Diseño. Geronimo Manso.
Patrones de Comportamiento: Patrón de Diseño Observer
* FRAUSTO JIMENEZ GABRIELA * * HERNANDEZ TORRES ANA LAURA * * MANDUJANO JUAN CARLOS * * NOVA MARIN YARELI PAULINA * * ZAVALA CORTE JOCELYN ARELI *
Arquitectura de una aplicación
Patrones Creacionales
Ingeniería de Software Orientado a Objetos
ANDRES FELIPE BORRERO SALAZAR COD ALEXANDRA CARREÑO SALAS COD LUCIO ANIBAL CRIOLLO COD ALEJANDRO RUIZ IDROBO COD
DISEÑO DE SOFTWARE 1ª. Parte
Lenguajes de Programación Tema 3
Patrones de diseño DECORATOR Mario Rodríguez Martín
Patrones de Diseño: Command
Patrones para asignar responsabilidades
CS-432: Ingeniería Moderna de Software Semana 3
Juan Manuel Perdigón Mario Felipe Monsalve
Son la base para la búsqueda de soluciones o problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.
INGENIERIA DE SOFTWARE GUILLERMO OCHOA GAVIRIA Octubre 2006 Factory Method.
Patrones de Diseño Carolina Perozo Julio Padrón Anthony Accardi.
Patrones de diseño Web Pierre Sergei Zuppa Azúa.
Ingeniería en Sistemas de Información
Universidad Central de Venezuela Facultad de Ciencias Postgrado en Ciencias de la Computación Sistemas Distribuidos Albany Márquez.
FUNDAMENTOS DE PROGRAMACION
Vista de interacción  Una vista de interacción muestra el flujo de control requerido que se establece entre los objetos.
SOFTWARE PARA PAGOS DE SUELDOS Patrones de Diseño
PATRONES DE DISEÑO.
Diagrama de Clases ACI 570.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Introducción a UML DIAGRAMA DE CLASES Departamento de Informática
El modelo de análisis tiene como objetivo generar una arquitectura de objetos que sirva como base para el diseño posterior del sistema. Dependiendo del.
Introducción al Lenguaje. ¿ Qué es PHP ? O Hypertext Pre-processoes (PHP) es un lenguaje de "código abierto" interpretado, de alto nivel, embebido en.
TEMA 9: DIAGRAMA DE CLASE EN UML
PROGRAMACION ORIENTADA A OBJETOS
Ingeniería de Software
UML 2.0 Diagramas de Comportamiento
Clasificación de Diagramas
PATRON OBSERVADOR DEIRY ALI NIETO. El patrón observador lo podemos clasificar como un ejemplo claro de patrones de comportamiento, debido a que este posee.
Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid Simulación del patrón … (3)
Patrones de diseño equipo n.1
UML Casos de Uso (repaso) y Diagramas de Clase
Introducción a los TADs
Edwin Oliveros.  El diseño de sistemas consiste en la transformación del modelo de diseño, que toma en cuenta los requerimientos no funcionales y las.
Unified Modeling Language (Lenguaje de Modelamiento unificado)
Diagrama de Clases.
PRESENTACION DE INGENIERIA ORIENTADA A OBJETOS
Fundamentos de Ingeniería de Software
Transcripción de la presentación:

Daniel Mazzini dmazzini@ubicasolutions.com Ubica Solutions Patrones de Diseño Daniel Mazzini dmazzini@ubicasolutions.com Ubica Solutions

Conocimientos previos Conocimientos de POO. UML (básico) C# Daniel Mazzini

Agenda Propósito de los patrones Fundamentos de diseño. Creación. Factory Method Singleton Abstract Factory Estructurales Adapter Facade Composite Comportamiento Command State Observer Daniel Mazzini

Propósito de los patrones ¿Qué es un patrón de diseño? ¿Por qué usarlos? Categorización Problema - Patrón Daniel Mazzini

¿Qué es un patrón de diseño? Ante un problema reiterado ofrece una solución contrastada que lo resuelve. Describe el problema en forma sencilla. Describe el contexto en que ocurre. Describe los pasos a seguir. Describe los puntos fuertes y débiles de la solución. Describe otros patrones asociados. Daniel Mazzini

¿Por qué usarlos? Mejora en la comunicación y documentación “Hay que hacer un Factory Method” Facilita la documentación interna del proyecto. Mejora la ingeniería de software. Eleva el nivel del grupo de desarrollo. Previene “reinventar la rueda” en diseño Son soluciones ya probadas. Mejora la calidad y estructura “¿Cuan grande debe ser una clase?” Daniel Mazzini

Categorización Fundamentales Creación Estructura Comportamiento Se usan en otros patrones mas grandes Creación Aislar el proceso de creación de un objeto. Estructura Desacopla el sistema. Comportamiento Describe situaciones de control de flujo. Daniel Mazzini

Problema - Patrón Crear un objeto sin especificar la clase a la que pertenece Abstract Factory Factory Method Prototype Dependencia para tareas especificas Command Cadena de Responsabilidad Daniel Mazzini

Problema – Patrón (cont) Dependencia hacia el hardware o software Abstract Factory Bridge Dependencia hacia los algoritmos Strategy Template Method Builder Daniel Mazzini

Problema – Patrón (cont) Alto acoplamiento Façade Mediator Observer Imposibilidad de cambiar la clases convenientemente Adapter Decorator Visitor Daniel Mazzini

Fundamentos de diseño Programar para las interfaz, no para la herencia. Favorecer la composición antes que la herencia. Delegación. Doble Herencia. Daniel Mazzini

Herencia o interfaz La herencia de clase define la implementación de una clase a partir de otra (excepto métodos abstractos) La herencia de interfaz define como se llamara el método o propiedad, pudiendo escribir distinto código en cada clase. Daniel Mazzini

Programar para las interfaz Reutilizar la implementación de la clase base es la mitad de la historia. Ventajas: Reducción de dependencias. El cliente desconoce la implementación. La vinculación se realiza en tiempo de ejecución. Da consistencia (contrato). Desventaja: Indireccionamiento. Daniel Mazzini

Favorecer la composición Ventajas de la herencia: Implementación ya realizada. Útil en situaciones “es un” Desventajas de usar herencia: Construir un monstruo. No se puede cambiar la implementación heredada en tiempo de ejecución. Quebrar la encapsulación. Visibilidad. Daniel Mazzini

Favorecer la composición (cont) Ventajas de la composición: Crear una nueva clase ensamblando con mas de una clase. Puede cambiar la clase con la cual ensamblo en tiempo de ejecución. Centrar cada clase en una tarea. Desventaja de la composición: Requiere escribir un poco mas de código. Indireccionamiento. Daniel Mazzini

return Delegado.operacion() Delegación Una forma de componer. Se delega un conjunto de operaciones de un objeto en otro objeto. “La herencia” que use en VB6. return Delegado.operacion() Daniel Mazzini

Anti-Ejemplo Nuevo requerimiento: No todos las ventanas son cuadradas Daniel Mazzini

Ejemplo de Delegado Quito la herencia en ventana Creo una interfaz para comunicar el delegador con el delegado Creo un método llamado Area en Ventana (solo para mantener compatibilidad) Llamo al método de la interfaz que me da el área Daniel Mazzini

DEMO Delegado Daniel Mazzini

Delegado en .Net Daniel Mazzini

Doble Herencia Problema: Mantener las clases que implementan como internas del proyecto (internal o Friend), pero la interfaz pública. Organizar clases que tienen un comportamiento parecido para que sea consistente. Daniel Mazzini

Doble Herencia (cont) Clase base es abstracta. La clase base puede heredar de mas de una interfaz. Una vez que están escritos los métodos, verifico si hay duplicación en las clases hijas. Daniel Mazzini

Doble Herencia en .NET Daniel Mazzini

Patrones de creación Propósito: Cuales veremos? Crear un objeto es una toma de decisión. Separar los procesos de creación de objeto y de uso de un objeto. Cuales veremos? Factory Method Singleton Abstract Factory Daniel Mazzini

Factory Method Problema: La instancia del objeto a crear depende de condiciones externas a la clase cliente. Puede cambiar independientemente de cambiar la clase cliente. Ya he creado la estructura con “Doble Herencia”, pero ahora necesito poder crear una instancia de cualquier clase concreta. Daniel Mazzini

Factory Method Daniel Mazzini

DEMO Factory Method Daniel Mazzini

F.M. con Constructor Estático Método estático en clase abstracta que retorno instancias. Constructores privados o protegidos. Daniel Mazzini

DEMO Static Factory Daniel Mazzini

Singleton Problema: No se puede tener mas de una instancia de una clase. Se necesita controlar el acceso a una clase. Daniel Mazzini

Singleton Cambio el constructor a privado. Hago que la clase no pueda ser heredada. Agrego una variable estática del mismo tipo de la clase donde esta contenida. (instancia) Agrego un método estático que retorne la variable estática. (GetInstance) No creo el objeto hasta que sea necesario (Lazy Creation) Agrego el código necesario para no crear dos instancias en distintos thread. Daniel Mazzini

DEMO Singleton Daniel Mazzini

Abstract Factory Problema Necesito crear una familia de objetos. Trabajo con mas de una familia. No puedo combinar ítems de las familias de objetos. El resto del sistema debe trabaja sin distinguir entre familias de objetos. Daniel Mazzini

Abstract Factory Daniel Mazzini

Carrera +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado TourDeFrancia +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado Ruedas CrearRueda() { return new Rueda26(); } Ruedas CrearRueda() { return new RuedaMoto(); } ParisDakar +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado GP de Catalunya +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado Ruedas CrearRueda() { return new RuedaF1(); } Daniel Mazzini

DEMO Abstract Factory Daniel Mazzini

Patrones de estructura Propósito: Desacoplar el sistema. Obtener una estructura flexible. Organizar. Cuales veremos? Adapter Facade Composite Daniel Mazzini

Facade Problemas: El cliente hace muchos viajes al servidor. Separe por capas, pero tengo muchas clases públicas en el servidor para que puedan ser creadas desde el cliente. Necesito estructurar las llamadas desde el cliente. Daniel Mazzini

Facade Form Cliente Cliente Form Pedidos Form Ctas Corrientes Presentación Lógica Daniel Mazzini

Facade Cliente A B C A.M B.M C.M Facade A B C Cliente F.M A.M B.M C.M Daniel Mazzini

Facade Caso de Uso = Facade Un caso de uso es lo interacción de un actor con el sistema. La métodos de la fachada encapsulan los pasos necesarios para llevar a cabo lo que el cliente desea hacer. Daniel Mazzini

DEMO Facade Daniel Mazzini

Adapter Problemas: Necesitamos llamar a un método a través de una interfaz para no tener dependencia en el cliente. La librería a la que hay que llamar no es nuestra y no implementa esa interfaz. No contamos con el código fuente de la librería. Daniel Mazzini

Adapter Cliente IOperacion ClaseA ClaseB ExternoAdaptado Externa _externa.DiferenteNombre() Externa +DiferenteNombre() Daniel Mazzini

DEMO Adapter Daniel Mazzini

Composite Problema: Estructuras de árbol o estructuras 1-N. Tiene un objeto complejo que hay que descomponer en partes. Nodos especiales que pueden contener otros nodos. Daniel Mazzini

Composite Almacén Especificación CompuestoAndEsp ColorEsp TamañoEsp Espec Rojos = new ColorEsp(Color.Red); ArrayList prodRojos =alm.Seleccionar(Rojos); Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList Espec RojoPeq = new CompuestoAndEsp( new ColorEsp(Color.Red), new TamañoEsp(Tamaño.Pequeño)); ArrayList prodRojos =alm.Seleccionar(RojoPeq); Espec Peq = new TamañoEsp(Tamaño.Pequeño); ArrayList prodPeq = alm.Seleccionar(Peq); Especificación +EstaOK(Producto):bool CompuestoAndEsp +CompuestoEsp(Espec, Espec) +EstaOK(Producto):bool ColorEsp +ColorEsp(ColorTipo) +EstaOK(Producto):bool TamañoEsp +TamañoEsp(TamañoTipo) +EstaOK(Producto):bool return (_espec1.EstaOK(Producto) && _espec2.EstaOK(Producto)); Daniel Mazzini

Composite Almacén Especificación CompuestoEsp ColorEsp TamañoEsp Espec[] ar = new Espec[] { new ColorEsp(Color.Red), new TamañoEsp(Tamaño.Pequeño)}; Espec ExpresionOr = new CompOrEsp(ar); ArrayList prodRojos =alm.Seleccionar(ExpresionOr); Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList Especificación +EstaOK(Producto):bool Lista CompuestoEsp #CompuestoEsp(Espec[]) ColorEsp TamañoEsp CompAndEsp +CompAndEsp(Espec[]) +EstaOK(Producto):bool CompOrEsp +CompOrEsp(Espec[]) +EstaOK(Producto):bool Daniel Mazzini

DEMO Composite Daniel Mazzini

Composite Dinámico Empleado Empleado NodosHojas NodosPadre Empleados +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double NodosHojas NodosPadre +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double Empleados Empleado +Agregar(Empleado) +Quitar(Empleado) +ObtenerSueldos():double -EsHoja() -Empleados:Arraylist Empleados Daniel Mazzini

DEMO Composite Dinámico Daniel Mazzini

Patrones de Comportamiento Propósito: Asignación de responsabilidad = Distribuir el comportamiento. Comunicación entre instancias. Se usa mas la composición que la herencia. Cuales veremos? Command Strategy State Daniel Mazzini

Command Problema: Operaciones repetidas (por ejemplo, en el menú y en el toolbar). Necesita controlar la secuencia de las operaciones. Necesito hacer un log de las operaciones que ejecuta el cliente. Daniel Mazzini

Command Cliente ICommand Comando1 Comando2 +Hacer() +Commando1(Estado) +Comando2(Ejecutar) +Hacer() Daniel Mazzini

Command Tambien puedo: Crear un método Deshacer en la Interfaz. Puedo crear una pila de los últimos comandos que se ejecutaran. Puedo sacar de la pila de comandos ejecutados y llamar al método Deshacer. Juntándolo con el patrón Composite puedo generar un comando Macro. Daniel Mazzini

Command Cliente Command Manager ICommand Comando1 Comando2 +Undo(int Cantidad) +Redo(int Cantidad) +CrearComando(estado) ICommand +Hacer() +DesHacer() Comando1 +Comando1(Estado) +Deshacer() Comando2 +Comando2(Estado) ComandoMacro lista Daniel Mazzini

DEMO Command Daniel Mazzini

State Problema: Mantener el estado de un objeto. La organización de la lógica que maneja el estado (maquina de estado) se torna incontrolable. Acoplamiento entre la funcionalidad propia de la clase y la funcionalidad para manejar el estado de un objeto. Daniel Mazzini

State Boya Estado Estado Estado -EstadoActual:Estado +CambiarEstado() Daniel Mazzini

Observer Problema: Tipos de objetos: Mantener distintos objetos relacionados, generalmente son relaciones 1 – N. Mantener las dependencias entre objetos, sin necesidad de conocer al otro objeto. Tipos de objetos: Publicador : Aquel que tiene que notificar de un cambio. Suscriptores: Aquellos interesados en recibir la notificación. Daniel Mazzini

Observer Publicador Observador C.Control Boya +Actualizar() +Agregar(Observador) +Quitar(Observador) +Notificar() foreach Observador item in al { Item.Actualizar() } C.Control +Actualizar() Boya +ObtenerEstado() Daniel Mazzini

Otras consideraciones Puedo enviar la información necesaria a los suscriptores al notificar o que pida lo que necesita (dependencia hacia el publicador) Ante casos de muchos publicadores, puedo hacer un Gestor de Cambios que haga la función de mediador. Al notificar se puede usar delegados y pasar clases que hereden de EventArgs al Suscriptor. Daniel Mazzini

DEMO Observer y State Daniel Mazzini

Conclusiones Empiece por un patron, estudie los problemas que resuelve y pase cuando lo haya probado. Si la espada ya esta sobre su cabeza, lea los problemas que resuelven todos los patrones. No deje de leer: Patrones de Diseño, E. Gamma y otros (GoF). Patterns of Enterprise Application Architecture, Martin Fowler Daniel Mazzini