Patrones para Mortales
Specification Pattern en C#
Germán Küber
Software Architect
Net-Baires
http://germankuber.com.ar
@germankuber
https://slack.net-baires.com.ar/
>_
EVENTUM
EVENTUM – Requerimientos (Consultas)
1. Filtrar por cantidad mínima de invitados
2. Filtrar por eventos validos
3. Filtrar por eventos con fecha valida
• Debe de faltar mas de 2 días para el evento
4. Filtrar por eventos premium
• No importa si la fecha es valida
• No importa si el evento esta validado
DEMO
EVENTUM
EVENTUM – Requerimientos
1. Cerrar eventos validos
• Eventos ya validados
• Eventos con fecha valida
2. Cerrar eventos Premium
• Eventos validos o premium
DEMO
“El patrón de especificación es un patrón que
nos permite encapsular parte del conocimiento
del dominio en una sola unidad (especificación)
y reutilizarlo en diferentes partes de la base del
código.”
¿Por qué patrón Specification?
• Evita la duplicación de reglas de negocio
• Provee una sintaxis declarativa
http://bit.ly/spec-pattern
Domain-Driven Design:
Tackling Complexity in the
Heart of Software
By Eric Evans
Patrón Specification
• Búsqueda en Base de Dato
• Validaciones en Memoria
• Construcción de objetos
Como trabaja LinQ
if (events.Any(x=> x.Guests >= 15))
{
//…
}
return context.Events
.Where(x => x.Guests >= 15)
.ToList();
Ejecuta en memoria Ejecuta en SQL
Guests >= 15
Como trabaja LinQ
return context.Events
.Where(x => x.Guests >= 15)
.ToList();
IEnumerable IQueryable
new [] { 1, 2 }.Where(x => x == 1);
DEMO
Guía de diseño
• Evitar implementar interfaces ISpecification
• Specifications lo mas especificas posibles
• Specifications Inmutables
Cuando no usar Specification?
• Aplicaciones muy simples
• Los costos de mantenimiento son bajos
• Los beneficios no justifican la inversión
>_
Gracias!!!
http://germankuber.com.ar
@germankuber
https://slack.net-baires.com.ar/

Specification

Notas del editor

  • #3 El componente solo puede conocer las capas del sistema en el que vive Esto permite agregar caches,. Proxys. Balanceadores de carga Entiende que los servidores estan en constante cambio Entiende que la red no es segura por lo que limita los contextos. Puede administrarse mejor dado que cada persona puede administrar su propio contexto. Escalabilidad Manajabilidad Cliente > proovedor > empresa > base de datos
  • #4 Hoy estoy acá con ustedes, no para enumerarles una lista de pros y contras de porque este patrón de diseño. Tampoco para mostrarles un ejemplo de manual, como podemos estar acostumbrados a ver y escuchar ni mucho menos para venderles un patrón de diseño. Hoy estoy acá con la intención de generales cucuriosidad. con la intención de mostrarles una alternativa al código que habitualmente escribimos. Hoy estoy acá con la ilusión de transmitirles una única necesidad: la necesidad de entender que nuestro código SIEMPRE puede ser cada mejor.
  • #7 El componente solo puede conocer las capas del sistema en el que vive Esto permite agregar caches,. Proxys. Balanceadores de carga Entiende que los servidores estan en constante cambio Entiende que la red no es segura por lo que limita los contextos. Puede administrarse mejor dado que cada persona puede administrar su propio contexto. Escalabilidad Manajabilidad Cliente > proovedor > empresa > base de datos
  • #14 El componente solo puede conocer las capas del sistema en el que vive Esto permite agregar caches,. Proxys. Balanceadores de carga Entiende que los servidores estan en constante cambio Entiende que la red no es segura por lo que limita los contextos. Puede administrarse mejor dado que cada persona puede administrar su propio contexto. Escalabilidad Manajabilidad Cliente > proovedor > empresa > base de datos
  • #18 DRY Principle Aumenta la mantenibilidad de nuestro código Introducico por Eric Evan y Martin Fowler principios del año 2000
  • #20 Encapsular conocimiento de negocio en una clase particular No tienen mucho en comun
  • #21 2. Es una expression no se ejecuta en memoria si no que se compilaFunc<int, bool> func = x => x == 1;
  • #22 2. Hay dos tipos de métodos de extensión que trabajan sobre ellos La matriz implementa Ienumerable Es una versión de Iqueruable porque implementa la interface En la segunda versión no es un delegado si no una expression Una lambda expression puede ser compilado a delegado o a una expression Lambda se compilara a un delegado Tambien compilara a una expression
  • #23 El componente solo puede conocer las capas del sistema en el que vive Esto permite agregar caches,. Proxys. Balanceadores de carga Entiende que los servidores estan en constante cambio Entiende que la red no es segura por lo que limita los contextos. Puede administrarse mejor dado que cada persona puede administrar su propio contexto. Escalabilidad Manajabilidad Cliente > proovedor > empresa > base de datos
  • #24 Define toda la comunicación entre servidores como la de un cliente con un servidor Separacion de responsabilidades entre cliente y servidor Evolucion independiente Los clientes solo conocen a los SERVIDORES y no los servidores a los CLIENTES Portabilidad de clientes Evolucion independiente
  • #25 No construimos una app sin estados Todo estado del cliente se mantiene en el cliente y se envia en la solicitud Evita sincronizacion entre servidores, y evita flujos complejos Si la conexión se cae , no pierdo el estado ya que le estado viaja en el request Pueden vivir app intermedias que sean capaz de aplica capas de seguridad Visibilidad Relaibility > si cae un servidor reinicio el workflow Escalabilidad
  • #26 Espero haberles generado esa curiosidad que les hable en un principio. Espero que hayan descubierto, espero haberles mostrado una forma diferente de hacer las cosas. Como pueden ver pasamos la mayor parte de la presentación entendiendo el problema, entendiendo la evolución natural de nuestra aplicación. Como pueden ver comenzamos con un diseño sencillo que poco a poco se fue complejizando, y fue esta complejidad la que sugirió que nuestro código estaba evolucionando en la dirección equivocada. Y esta evolución misma fue la que nos presento la necesidad de aplicar este patrón de diseño que acabo de presentarles. Espero que hoy de aca se lleven lo que vine a contarles lo que vine a mostrarles. Espero que hoy de aca se lleven principalmente una idea en sus cabezas, que pese a que nuestro código inicial estaba bien nada nos pr