La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Patrones de Diseño Daniel Mazzini Ubica Solutions.

Presentaciones similares


Presentación del tema: "Patrones de Diseño Daniel Mazzini Ubica Solutions."— Transcripción de la presentación:

1 Patrones de Diseño Daniel Mazzini Ubica Solutions

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

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

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

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

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

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

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

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

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

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

12 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 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. La herencia de interfaz define como se llamara el método o propiedad, pudiendo escribir distinto código en cada clase.

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

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

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

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

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

18 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

19 Daniel Mazzini

20 Delegado en.Net

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

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

23 Daniel Mazzini Doble Herencia en.NET

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

25 Daniel Mazzini Factory Method Problema: Problema: La instancia del objeto a crear depende de condiciones externas a la clase cliente. La instancia del objeto a crear depende de condiciones externas a la clase cliente. Puede cambiar independientemente de cambiar 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. Ya he creado la estructura con Doble Herencia, pero ahora necesito poder crear una instancia de cualquier clase concreta.

26 Daniel Mazzini Factory Method

27 Daniel Mazzini

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

29 Daniel Mazzini

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

31 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.

32 Daniel Mazzini

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

34 Daniel Mazzini Abstract Factory

35 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(); } ParisDakar +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado Ruedas CrearRueda() { return new RuedaMoto(); } GP de Catalunya +CrearMovil(Chasis,Rueda[]):Movil +CrearRueda():Rueda +CrearChasis():Chasis +CrearTrazado():Trazado Ruedas CrearRueda() { return new RuedaF1(); }

36 Daniel Mazzini

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

38 Daniel Mazzini Facade Problemas: Problemas: El cliente hace muchos viajes al servidor. 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. 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. Necesito estructurar las llamadas desde el cliente.

39 Daniel Mazzini Facade Form Cliente Form Pedidos Form Ctas Corrientes PresentaciónLógica Cliente

40 Daniel Mazzini Facade ClienteABC A.M B.M C.M FacadeABCCliente F.M A.M B.M C.M

41 Daniel Mazzini Facade Caso de Uso = 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. 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.

42 Daniel Mazzini

43 Adapter Problemas: Problemas: Necesitamos llamar a un método a través de una interfaz para no tener dependencia en el cliente. 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. 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. No contamos con el código fuente de la librería.

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

45 Daniel Mazzini

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

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

48 Daniel MazziniComposite Especificación +EstaOK(Producto):bool Almacén -Productos():ArrayList +Seleccionar(Especificacion):ArrayList ColorEspTamañ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); CompuestoEsp #CompuestoEsp(Espec[]) CompAndEsp +CompAndEsp(Espec[]) +EstaOK(Producto):bool CompOrEsp +CompOrEsp(Espec[]) +EstaOK(Producto):bool Lista

49 Daniel Mazzini

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

51 Daniel Mazzini

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

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

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

55 Daniel Mazzini Command Tambien puedo: Tambien puedo: Crear un método Deshacer en la Interfaz. Crear un método Deshacer en la Interfaz. Puedo crear una pila de los últimos comandos que se ejecutaran. 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. 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. Juntándolo con el patrón Composite puedo generar un comando Macro.

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

57 Daniel Mazzini

58 State Problema: Problema: Mantener el estado de un objeto. Mantener el estado de un objeto. La organización de la lógica que maneja el estado (maquina de estado) se torna incontrolable. 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. Acoplamiento entre la funcionalidad propia de la clase y la funcionalidad para manejar el estado de un objeto.

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

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

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

62 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) 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. 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. Al notificar se puede usar delegados y pasar clases que hereden de EventArgs al Suscriptor.

63 Daniel Mazzini

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


Descargar ppt "Patrones de Diseño Daniel Mazzini Ubica Solutions."

Presentaciones similares


Anuncios Google