Patrón Criteria (patrón de diseño)
# Patrón Criteria (patrón de diseño)

En diseño de software, el patrón de especificación (y en su caso particular, criteria o filter) es un patrón de diseño, mediante el cual, se permite filtrar una colección de objetos bajo diversos criterios, encadenándolos de una manera desacoplada por medio de operaciones lógicas. Este patrón se utiliza en escenarios específicos, donde la obtención de uno o más entidades depende de reglas de negocio. Fue creado por Eric Evans y Martin Fowler

## Propósito

Filtrar colecciones de objetos según diversos criterios de forma desacoplada. Permitir la reutilización y anidación de criterios por medio de operaciones lógicas (and, or, not). Generar una manera legible y extensible de agregar o quitar lógica para filtrar colecciones de objetos.

## Motivación

Frecuentemente, se necesita filtrar colecciones de objetos de la misma familia (clase base) utilizando criterios similares, pero en distinto orden y/o condición. También a menudo, esta lógica para filtrar colecciones es un proceso clave o complejo como pueden ser los criterios de planificación en un Sistema Operativo o el manejo de prioridades para una cola de peticiones. Otra caso sería el tener altas posibilidades de cambio en el futuro sobre la lógica que realiza el filtrado en esta colección de objetos. Sea quitando/modificando criterios existentes, como así también agregando nuevos. Este patrón pone gran énfasis en la extensibilidad y reutilización de criterios, como así también en la legibilidad del código.

## Ventajas

* Extensibilidad
* Legibilidad
* Reutilización de criterios
* Facilidad para hacer test unitarios (cada criterio se puede probar independiente, el patrón asegura el uso colectivo)
* Activación de criterios en tiempo de ejecución (dependiendo del lenguaje de programación)

## Estructura

Estructura básica del patrón independiente del lenguaje de programación.

## Estructura .NET

Aquí se presenta para .NET, utilizando métodos de extensión

## Ejemplo de uso

Suponiendo la existencia de la clase Persona

Y creando estos criterios:

Podríamos filtrar a los hombres extranjeros y solteros

O a las mujeres extranjeras

O también podríamos filtrar a los hombres o mujeres (a todos)

