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