Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Design patterns I

Design patterns I

Part of Mr.Milu's "design patterns" internal talks

Jorge Garrido

May 20, 2016
Tweet

More Decks by Jorge Garrido

Other Decks in Programming

Transcript

  1. Mr.Milú ¿Que es una Fluent Interface? Es un patrón usado

    para exponer las interfaces de un objeto o dominio de forma que podamos encadenar los métodos expuestos conformado una cadena casi textual fácilmente legible. Las Interfaces fluidas tratan de definir un lenguaje específico al domino de actuación (DSL) de forma que nos parezca un lenguaje natural. Este patrón de diseño es muy popular en librerías que se basan en la configuración o construcción de objetos a partir de method chainning 2
  2. Mr.Milú Mejor con ejemplos I Pongamos como ejemplo el caso

    de construir un vehículo, de forma clásica sería de forma similar a esta: Vehicle v = new Vehicle(); v.setWheelsNum(4); v.setPower(100, “HP”); v.setDoorsNum(3); v.setConvertibleOption(false); 3
  3. Mr.Milú Mejor con ejemplos II Usando el patrón Fluent obtendriamos

    algo más legible y fácil de interpretar: Vehicle v = new Vehicle().wheels(4).power(100).powerUnit(“HP”).doors(3).notConvertible(); otra posibilidad sería: Vehicle v = Vehicle.with().wheels(4).power(75).units(“Kw”).doors(3).and().notConvertible(); (Otro ejemplo extraído de Shakn [android]): persistence.filter.types().by(“group”, “RELTYPE”).from(“page”, 1).with(“page_size”, 20).doIt(); 4
  4. Mr.Milú Resumen Este patrón de diseño consiste en emular un

    lenguaje natural, definido en forma de DSL para exponer de forma intuitiva la configuración de una interfaz. - Ventajas: fácil de leer y código más corto, la ayuda del IDE mediante la sugerencia de funciones, altamente flexible. - Desventajas: al principio puede ser complicado identificar dónde aplicarlo y donde no, el uso de métodos adicionales para dotar de sentido a la interfaz. 5
  5. Mr.Milú ¿Patrón Observer? Tal como indica su nombre, su función

    es observar a otros, en concreto, observar cambios en otros objetos y actuar en consecuencia. Al ser este un patrón de comportamiento define tanto una estructura a seguir como unos esquemas de comunicación entre los objetos implicados. Se basa en dos conceptos: Observador y observable, el primero (uno o varios) se adhiere(n) al segundo y éste notifica de sus cambios al(los) primero(s). 7
  6. Mr.Milú Una de ejemplos I class Observable { Observer observer;

    void addObserver(Observer ob) { observer = ob; } void notifyChange() { observer.notify(this); } } class Semaforo extends Observable { String estad; void cambiaEstado(String s) { estad = s; notifyChange(); } } 8
  7. Mr.Milú Una de ejemplos II interface Observer { void notify(Observable

    observable); } class Policia implements Observer { void noitify(Semaforo sem) { if (sem.estado == “Estropeado”) sout(“¡ALTO!”); } } Implementación y uso: Semaforo semaforo = new Semaforo(); semaforo.addObserver(new Policia()); semaforo.cambiaEstado(“Estropeado”); Salida de consola: ¡ALTO! 9
  8. Mr.Milú ¿Patrón repositorio? ¿repositorio de qué? El patrón repositorio se

    idéa con el objetivo de abstraer a la lógica de negocio de la capa de datos de la aplicación. El repositorio en sí, se entendería como el mediador entre la capa de datos y el dominio de la aplicación, de forma que el dominio debe ser agnóstico a la persistencia de sus datos, es decir ignorar dónde y de qué forma se persisten los mismos. Para conseguir esto, el patrón nos dicta tener un mediador con relación 1...N donde N serán las fuentes de datos (datasources). Así mismo, habrá que definir unas interfaces uniformes para el acceso a estos datasources y unos datamappers para mapear las respuestas. 11
  9. Mr.Milú Pros vs. Cons? All pros!! - Acceso centralizado a

    datos. - Lógica y reglas de acceso consistentes. - Código legible y fácilmente mantenible. - Abstracción a la hora de persistir y cargar datos (ni sabemos como ni donde). - Habilidad para devolver los datos modelados. - Facilidad de implementación de estratégias de caché. - Por supuesto, flexibilidad para añadir o eliminar las fuentes de datos necesarias. - Altamente desacoplado y testeable. ¿Alguien dá más? 14