SlideShare una empresa de Scribd logo
WWW.PRACTICASDESOFTWARE.COM.AR

Criteria
Patrón de diseño
Andrés Grosso – andres.grosso@engee.com.ar
20/09/2010

El patrón Criteria es una adaptación del patrón Specification y es utilizado para filtrar colecciones de objetos de una
manera desacoplada.
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Índice
Definición ..................................................................................................................................................................................... 3
Propósito ..................................................................................................................................................................................... 3
Motivación ................................................................................................................................................................................... 3
Estructura .................................................................................................................................................................................... 4
Implementación ........................................................................................................................................................................... 6
Ejemplo ........................................................................................................................................................................................ 8
Referencias .................................................................................................................................................................................. 9

2
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Definición
Criteria 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.

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.

3
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Estructura
Estructura básica del patrón independiente del lenguaje de programación.
A continuación se presentan dos maneras de representar la estructura del patrón.

a)

b)

4
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Aquí se presenta para .NET

c)

5
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Implementación
Implementación específica para .NET, la cual utiliza métodos de extensión en lugar de la clase abstracta
de “CompositeCriteriaOOP”.
Según la necesidad específica para cada caso, se puede determinar que si ya se encuentra un objeto
que cumple con el criterio se salga del resto de los criterios anidados (como en este ejemplo), teniendo
como objetivo final devolver siempre un único objeto.
En el caso de que se necesite que devuelva todos los ítems que cumplen con el criterio, sea 1 o más, se
debe modificar la implementación del método “MeetCriteria” de la clase “AndCriteria”.
public interface ICriteria<E>
{
List<E> MeetCriteria(List<E> entities);
}
internal class AndCriteria<E> : ICriteria<E>
{
private ICriteria<E> _criteria;
private ICriteria<E> _otherCriteria;
internal AndCriteria(ICriteria<E> criteria, ICriteria<E> otherCriteria)
{
_criteria = criteria;
_otherCriteria = otherCriteria;
}
public List<E> MeetCriteria(List<E> entities)
{
var result = _criteria.MeetCriteria(entities);
//
//
//
//
if

Si ya devuelve 1, es que uno solo cumplio el criterio y no
se ejecutan los ands anidados
Si ya devuelve 0, es que ninguno cumplio con el criterio y
no se ejecutan los ands anidados
(result.Count == 0 || result.Count == 1)
return result;

return _otherCriteria.MeetCriteria(result);
}
}
internal class OrCriteria<E> : ICriteria<E>
{
private ICriteria<E> _criteria;
private ICriteria<E> _otherCriteria;
internal OrCriteria(ICriteria<E> criteria, ICriteria<E> otherCriteria)
{
_criteria = criteria;
_otherCriteria = otherCriteria;
}

6
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

public List<E> MeetCriteria(List<E> entities)
{
List<E> firstCriteriaItems = _criteria.MeetCriteria(entities);
List<E> otherCriteriaItems = _otherCriteria.MeetCriteria(entities);
foreach (E otherCriteriaItem in otherCriteriaItems)
{
if(!firstCriteriaItems.Contains(otherCriteriaItem))
firstCriteriaItems.Add(otherCriteriaItem);
}
return firstCriteriaItems;
}
}
internal class NotCriteria<E> : ICriteria<E>
{
private ICriteria<E> _criteria;
internal NotCriteria(ICriteria<E> x)
{
_criteria = x;
}
public List<E> MeetCriteria(List<E> entities)
{
List<E> notCriteriaItems = _criteria.MeetCriteria(entities);
foreach (E notCriteriaItem in notCriteriaItems)
entities.Remove(notCriteriaItem);
return entities;
}
}
public static class CriteriaExtensionMethods
{
public static ICriteria<E> And<E>(this ICriteria<E> criteria,
ICriteria<E> otherCriteria)
{
return new AndCriteria<E>(criteria, otherCriteria);
}
public static ICriteria<E> Or<E>(this ICriteria<E> criteria,
ICriteria<E> otherCriteria)
{
return new OrCriteria<E>(criteria, otherCriteria);
}
public static ICriteria<E> Not<E>(this ICriteria<E> criteria)
{
return new NotCriteria<E>(criteria);
}
}

7
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Ejemplo
Suponiendo el escenario de un centro médico, donde por cada paciente hay una colección de ítems de
atención, los cuales pueden ser indicaciones (laboratorio, rayos, radiografías, ect.) o turnos, el proceso
que determina que turno e indicación deben ser atendidas primero, puede ser implementado con el
patrón Criteria.
Para este escenario de ejemplo, básicamente existen una colección de turnos e indicaciones para un
paciente, y según ciertos criterios se debe elegir a un solo turno y una sola indicación. El turno e
indicación que cumplan con los criterios serán los que primero realizará el paciente.
static void Main(string[] args)
{
// Se generan 3 turnos para el paciente Juan Perez
List<Turno> turnos = FillTestTurnos();
// Se generan 5 indicaciones para el paciente Juan Perez
List<Indicacion> indicaciones = FillTestIndicaciones();
/* Se recomienda utilizar un factory para la creación de los criterios */
// Le da prioridad a los items que tengan el estado ‘ProximaAtencion’
ICriteria<Item> proxAtenc = new CriterioProximaAtencion();
// Le da prioridad a los items que tengan el flag de urgente en true
ICriteria<Item> urgente = new CriterioUrgente();
// Le da prioridad al ítem con el menor orden cronológico
ICriteria<Item> ordCron = new CriterioOrdenCronologico();
// Retorna unicamente los items que tengan por lo menos un consultorio habilitado
// (que puedan ser atendidos)
ICriteria<Item> consulHabil = new CriterioConsultorioHabiitado();
// Le da prioridad a las indicaciones que tengan el menor tiempo de espera
ICriteria<Indicacion> tiemEsp = new CriterioTiempoEspera();
// Se crean los criterios de los turnos según orden y necesidad
ICriteria<Item> turnosCriteria = consulHabil.
And(proxAtenc).
And(urgente).
And(ordCron);
// Se crean los criterios de las indicaciones según orden y necesidad
ICriteria<Item> indicacionesCriteria = consulHabil.
And(proxAtenc.And(urgente)).
Or(tiemEsp.And(ordCron));
var turnos = turnosCriteria.MeetCriteria(turnos);
var indicaciones = indicacionesCriteria.MeetCriteria(indicaciones);
// En este ejemplo de uso del patrón, se necesita obtener un sólo turno y una sola
// indicación. Con lo cual las colecciones de turnos e indicaciones tendrán siempre
// un único ítem.
var turno = turnos.FirstOrDefault();
var indicacion = indicaciones.FirstOrDefault();
Console.WriteLine(string.Format("El Turno que será atendido es el {0}",
turno.idTurno));
Console.WriteLine(string.Format("La indicacion que será atendida es {0}",
indicacion.idIndicacion));
Console.ReadLine();
}

8
Criteria
Andrés Grosso – andres.grosso@engee.com.ar

Referencias
-

http://martinfowler.com/apsupp/spec.pdf

9

Más contenido relacionado

La actualidad más candente

Domain Driven Rails
Domain Driven RailsDomain Driven Rails
Domain Driven Rails
Yan Pritzker
 
Google BigQuery Best Practices
Google BigQuery Best PracticesGoogle BigQuery Best Practices
Google BigQuery Best Practices
Matillion
 
JSON-LD and SHACL for Knowledge Graphs
JSON-LD and SHACL for Knowledge GraphsJSON-LD and SHACL for Knowledge Graphs
JSON-LD and SHACL for Knowledge Graphs
Franz Inc. - AllegroGraph
 
Using Software Architecture Principles in Practice
Using Software Architecture Principles in PracticeUsing Software Architecture Principles in Practice
Using Software Architecture Principles in Practice
Eoin Woods
 
Cascading style sheet
Cascading style sheetCascading style sheet
Cascading style sheet
Michael Jhon
 
Html5 semantics
Html5 semanticsHtml5 semantics
Html5 semantics
Webtech Learning
 
TiDB Introduction
TiDB IntroductionTiDB Introduction
TiDB Introduction
Morgan Tocker
 
SHACL: Shaping the Big Ball of Data Mud
SHACL: Shaping the Big Ball of Data MudSHACL: Shaping the Big Ball of Data Mud
SHACL: Shaping the Big Ball of Data Mud
Richard Cyganiak
 
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
IXIASOFT
 
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
Edureka!
 
DSpace-CRIS: new features and contribution to the DSpace mainstream
DSpace-CRIS: new features and contribution to the DSpace mainstreamDSpace-CRIS: new features and contribution to the DSpace mainstream
DSpace-CRIS: new features and contribution to the DSpace mainstream
4Science
 
온톨로지 추론 개요
온톨로지 추론 개요온톨로지 추론 개요
온톨로지 추론 개요Sang-Kyun Kim
 
CSS
CSSCSS
An Introduction to Dashing and Smashing
An Introduction to Dashing and SmashingAn Introduction to Dashing and Smashing
An Introduction to Dashing and Smashing
Kunal Saha
 
An Introduction to SPARQL
An Introduction to SPARQLAn Introduction to SPARQL
An Introduction to SPARQL
Olaf Hartig
 
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal ElektronikMengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
Relawan Jurnal Indonesia
 
SPARQL-DL - Theory & Practice
SPARQL-DL - Theory & PracticeSPARQL-DL - Theory & Practice
SPARQL-DL - Theory & Practice
Adriel Café
 
Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFuture
José Paumard
 
Práctica web de la sesión 7.pptx
Práctica web de la sesión 7.pptxPráctica web de la sesión 7.pptx
Práctica web de la sesión 7.pptx
DARWINALEXISGUTIERRE
 
Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQL
Rodrigo Prates
 

La actualidad más candente (20)

Domain Driven Rails
Domain Driven RailsDomain Driven Rails
Domain Driven Rails
 
Google BigQuery Best Practices
Google BigQuery Best PracticesGoogle BigQuery Best Practices
Google BigQuery Best Practices
 
JSON-LD and SHACL for Knowledge Graphs
JSON-LD and SHACL for Knowledge GraphsJSON-LD and SHACL for Knowledge Graphs
JSON-LD and SHACL for Knowledge Graphs
 
Using Software Architecture Principles in Practice
Using Software Architecture Principles in PracticeUsing Software Architecture Principles in Practice
Using Software Architecture Principles in Practice
 
Cascading style sheet
Cascading style sheetCascading style sheet
Cascading style sheet
 
Html5 semantics
Html5 semanticsHtml5 semantics
Html5 semantics
 
TiDB Introduction
TiDB IntroductionTiDB Introduction
TiDB Introduction
 
SHACL: Shaping the Big Ball of Data Mud
SHACL: Shaping the Big Ball of Data MudSHACL: Shaping the Big Ball of Data Mud
SHACL: Shaping the Big Ball of Data Mud
 
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
Optimizing Content Reuse with DITA - LavaCon Webinar with Keith Schengili-Rob...
 
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
Elasticsearch Tutorial | Getting Started with Elasticsearch | ELK Stack Train...
 
DSpace-CRIS: new features and contribution to the DSpace mainstream
DSpace-CRIS: new features and contribution to the DSpace mainstreamDSpace-CRIS: new features and contribution to the DSpace mainstream
DSpace-CRIS: new features and contribution to the DSpace mainstream
 
온톨로지 추론 개요
온톨로지 추론 개요온톨로지 추론 개요
온톨로지 추론 개요
 
CSS
CSSCSS
CSS
 
An Introduction to Dashing and Smashing
An Introduction to Dashing and SmashingAn Introduction to Dashing and Smashing
An Introduction to Dashing and Smashing
 
An Introduction to SPARQL
An Introduction to SPARQLAn Introduction to SPARQL
An Introduction to SPARQL
 
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal ElektronikMengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
Mengenal OJS dan Bagaimana Menggunakannya untuk Tata Kelola Jurnal Elektronik
 
SPARQL-DL - Theory & Practice
SPARQL-DL - Theory & PracticeSPARQL-DL - Theory & Practice
SPARQL-DL - Theory & Practice
 
Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFuture
 
Práctica web de la sesión 7.pptx
Práctica web de la sesión 7.pptxPráctica web de la sesión 7.pptx
Práctica web de la sesión 7.pptx
 
Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQL
 

Destacado

Everything you need to know for the Big Fall
Everything you need to know for the Big Fall Everything you need to know for the Big Fall
Everything you need to know for the Big Fall
Niels Caszo
 
Seel GmbH Profil
Seel GmbH ProfilSeel GmbH Profil
Seel GmbH Profil
Wolfgang Dietzinger
 
CloseShave
CloseShaveCloseShave
CloseShave
Morgan Brenner
 
Tal Kyu An Hearing Notice
Tal Kyu An Hearing NoticeTal Kyu An Hearing Notice
Tal Kyu An Hearing NoticeJohn Rust
 
Acta de compromiso upa2014
Acta de compromiso upa2014Acta de compromiso upa2014
Acta de compromiso upa2014
Lisbeth Huacho
 
Anedup junio 2013
Anedup junio 2013Anedup junio 2013
Anedup junio 2013
Carlos Romero Sanchez
 
Kbk 3073 kepelbagaian kecerdasan
Kbk 3073 kepelbagaian kecerdasanKbk 3073 kepelbagaian kecerdasan
Kbk 3073 kepelbagaian kecerdasanLee Cyee
 
Tablas integrales
Tablas integralesTablas integrales
Tablas integrales
Paulo0415
 
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
Emma Rivera
 
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
D2L Barry
 
Возврат инвестиций рекламы лекарств в интернете
Возврат инвестиций рекламы лекарств в интернетеВозврат инвестиций рекламы лекарств в интернете
Возврат инвестиций рекламы лекарств в интернете
Alex Burenkov
 
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
Santiago Garcia Blanco
 
La llama-llorona
La llama-lloronaLa llama-llorona
La llama-llorona
Patricia Melo
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
Sergey Xek
 
Relación entre inflación y pib
Relación entre inflación y pibRelación entre inflación y pib
Relación entre inflación y pib
Kika Zam
 

Destacado (17)

Assignment he
Assignment heAssignment he
Assignment he
 
HSDPA / HSUPA Rel 7 Technology
HSDPA / HSUPA Rel 7 TechnologyHSDPA / HSUPA Rel 7 Technology
HSDPA / HSUPA Rel 7 Technology
 
Everything you need to know for the Big Fall
Everything you need to know for the Big Fall Everything you need to know for the Big Fall
Everything you need to know for the Big Fall
 
Seel GmbH Profil
Seel GmbH ProfilSeel GmbH Profil
Seel GmbH Profil
 
CloseShave
CloseShaveCloseShave
CloseShave
 
Tal Kyu An Hearing Notice
Tal Kyu An Hearing NoticeTal Kyu An Hearing Notice
Tal Kyu An Hearing Notice
 
Acta de compromiso upa2014
Acta de compromiso upa2014Acta de compromiso upa2014
Acta de compromiso upa2014
 
Anedup junio 2013
Anedup junio 2013Anedup junio 2013
Anedup junio 2013
 
Kbk 3073 kepelbagaian kecerdasan
Kbk 3073 kepelbagaian kecerdasanKbk 3073 kepelbagaian kecerdasan
Kbk 3073 kepelbagaian kecerdasan
 
Tablas integrales
Tablas integralesTablas integrales
Tablas integrales
 
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
Cambio climático "ANIMALES EN PELIGRO DE EXTINCIÓN"
 
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
Using Brightspaceto Create a Virtual Message Center for an Entire Academic Pr...
 
Возврат инвестиций рекламы лекарств в интернете
Возврат инвестиций рекламы лекарств в интернетеВозврат инвестиций рекламы лекарств в интернете
Возврат инвестиций рекламы лекарств в интернете
 
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
20150423 Tribuna Opinión Diario Vasco - Santiago Garcia Director General FIMM
 
La llama-llorona
La llama-lloronaLa llama-llorona
La llama-llorona
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
 
Relación entre inflación y pib
Relación entre inflación y pibRelación entre inflación y pib
Relación entre inflación y pib
 

Similar a Patrón de diseño Criteria

C# Nuevas características en C# 6
C# Nuevas características en C# 6C# Nuevas características en C# 6
C# Nuevas características en C# 6
HARUN PEHLIVAN
 
02401 04-509376nomivkzutz
02401 04-509376nomivkzutz02401 04-509376nomivkzutz
02401 04-509376nomivkzutz
giomar_alvarezc
 
Diseño de Objetos
Diseño de ObjetosDiseño de Objetos
Diseño de Objetos
Javier Calderon
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
Software Guru
 
Algoritmos - Jordi Gironés Roig
Algoritmos - Jordi Gironés RoigAlgoritmos - Jordi Gironés Roig
Algoritmos - Jordi Gironés Roig
Drakho Firesoul
 
Texto Paralelo.pptx
Texto Paralelo.pptxTexto Paralelo.pptx
Texto Paralelo.pptx
ANGELRAULABILIOCABRE
 
Tarea 1 metodos y modelos de la reingenieria
Tarea 1 metodos y modelos de la reingenieriaTarea 1 metodos y modelos de la reingenieria
Tarea 1 metodos y modelos de la reingenieria
Elizabeth Juarez
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
Juan Ramón Laguardia
 
03 Oop
03   Oop03   Oop
03 Oop
Network Sens
 
Visual basic.net
Visual basic.netVisual basic.net
Visual basic.net
Daybi Montoya
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
Fernando Perez
 
Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a tdd
Juan Jose Villar Ortuño
 
La palabra reservada this y los métodos "getters" y "setters"
La palabra reservada this y los métodos "getters" y "setters"La palabra reservada this y los métodos "getters" y "setters"
La palabra reservada this y los métodos "getters" y "setters"
ingemg1
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
jaircazarin
 
Análisis y diseño orientado a objetos
Análisis y diseño orientado a objetosAnálisis y diseño orientado a objetos
Análisis y diseño orientado a objetos
Christian Leon
 
Manual+de+programacion+de+macros+en+excel
Manual+de+programacion+de+macros+en+excelManual+de+programacion+de+macros+en+excel
Manual+de+programacion+de+macros+en+excel
Jose Leon Capcha
 
Informe - Investigacion de Operaciones
Informe - Investigacion de OperacionesInforme - Investigacion de Operaciones
Informe - Investigacion de Operaciones
Fernando Gonzalez Paolini
 
Tuning fondo-negro-2
Tuning fondo-negro-2Tuning fondo-negro-2
Tuning fondo-negro-2
Felipe Ciau Cante
 
Workshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensionesWorkshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensiones
Visual Engineering
 
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designer
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designerTutorial - Crea un modelo de clasificación con Azure Machine Learning designer
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designer
Luis Beltran
 

Similar a Patrón de diseño Criteria (20)

C# Nuevas características en C# 6
C# Nuevas características en C# 6C# Nuevas características en C# 6
C# Nuevas características en C# 6
 
02401 04-509376nomivkzutz
02401 04-509376nomivkzutz02401 04-509376nomivkzutz
02401 04-509376nomivkzutz
 
Diseño de Objetos
Diseño de ObjetosDiseño de Objetos
Diseño de Objetos
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
Algoritmos - Jordi Gironés Roig
Algoritmos - Jordi Gironés RoigAlgoritmos - Jordi Gironés Roig
Algoritmos - Jordi Gironés Roig
 
Texto Paralelo.pptx
Texto Paralelo.pptxTexto Paralelo.pptx
Texto Paralelo.pptx
 
Tarea 1 metodos y modelos de la reingenieria
Tarea 1 metodos y modelos de la reingenieriaTarea 1 metodos y modelos de la reingenieria
Tarea 1 metodos y modelos de la reingenieria
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
03 Oop
03   Oop03   Oop
03 Oop
 
Visual basic.net
Visual basic.netVisual basic.net
Visual basic.net
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
 
Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a tdd
 
La palabra reservada this y los métodos "getters" y "setters"
La palabra reservada this y los métodos "getters" y "setters"La palabra reservada this y los métodos "getters" y "setters"
La palabra reservada this y los métodos "getters" y "setters"
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
Análisis y diseño orientado a objetos
Análisis y diseño orientado a objetosAnálisis y diseño orientado a objetos
Análisis y diseño orientado a objetos
 
Manual+de+programacion+de+macros+en+excel
Manual+de+programacion+de+macros+en+excelManual+de+programacion+de+macros+en+excel
Manual+de+programacion+de+macros+en+excel
 
Informe - Investigacion de Operaciones
Informe - Investigacion de OperacionesInforme - Investigacion de Operaciones
Informe - Investigacion de Operaciones
 
Tuning fondo-negro-2
Tuning fondo-negro-2Tuning fondo-negro-2
Tuning fondo-negro-2
 
Workshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensionesWorkshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensiones
 
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designer
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designerTutorial - Crea un modelo de clasificación con Azure Machine Learning designer
Tutorial - Crea un modelo de clasificación con Azure Machine Learning designer
 

Más de Andrés Grosso

Engee IT - Institucional
Engee IT - InstitucionalEngee IT - Institucional
Engee IT - Institucional
Andrés Grosso
 
software testing
software testingsoftware testing
software testing
Andrés Grosso
 
Esemap
EsemapEsemap
Introducción al análisis y relevamiento
Introducción al análisis y relevamientoIntroducción al análisis y relevamiento
Introducción al análisis y relevamiento
Andrés Grosso
 
SOLID
SOLIDSOLID
CQRS
CQRSCQRS
Transicionkanban
TransicionkanbanTransicionkanban
Transicionkanban
Andrés Grosso
 
Taller definición bugs
Taller definición bugsTaller definición bugs
Taller definición bugs
Andrés Grosso
 
Taller casos de prueba
Taller casos de pruebaTaller casos de prueba
Taller casos de prueba
Andrés Grosso
 
Scrum
ScrumScrum

Más de Andrés Grosso (10)

Engee IT - Institucional
Engee IT - InstitucionalEngee IT - Institucional
Engee IT - Institucional
 
software testing
software testingsoftware testing
software testing
 
Esemap
EsemapEsemap
Esemap
 
Introducción al análisis y relevamiento
Introducción al análisis y relevamientoIntroducción al análisis y relevamiento
Introducción al análisis y relevamiento
 
SOLID
SOLIDSOLID
SOLID
 
CQRS
CQRSCQRS
CQRS
 
Transicionkanban
TransicionkanbanTransicionkanban
Transicionkanban
 
Taller definición bugs
Taller definición bugsTaller definición bugs
Taller definición bugs
 
Taller casos de prueba
Taller casos de pruebaTaller casos de prueba
Taller casos de prueba
 
Scrum
ScrumScrum
Scrum
 

Último

TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
bendezuperezjimena
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
ValeriaAyala48
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
CesarPazosQuispe
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
larapalaciosmonzon28
 
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
alejandromanuelve
 
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVATECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
LilibethEstupian
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
larapalaciosmonzon28
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
NicandroMartinez2
 
Gabinete, puertos y dispositivos que se conectan al case
Gabinete,  puertos y  dispositivos que se conectan al caseGabinete,  puertos y  dispositivos que se conectan al case
Gabinete, puertos y dispositivos que se conectan al case
JuanaNT7
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
AMADO SALVADOR
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
AMADO SALVADOR
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
Miguel Rebollo
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
larapalaciosmonzon28
 
HERRAMIENTAS WEB--------------------.pptx
HERRAMIENTAS WEB--------------------.pptxHERRAMIENTAS WEB--------------------.pptx
HERRAMIENTAS WEB--------------------.pptx
maralache30
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Festibity
 
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialCatalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
AMADO SALVADOR
 

Último (20)

TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
 
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
 
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVATECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
 
Gabinete, puertos y dispositivos que se conectan al case
Gabinete,  puertos y  dispositivos que se conectan al caseGabinete,  puertos y  dispositivos que se conectan al case
Gabinete, puertos y dispositivos que se conectan al case
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
 
HERRAMIENTAS WEB--------------------.pptx
HERRAMIENTAS WEB--------------------.pptxHERRAMIENTAS WEB--------------------.pptx
HERRAMIENTAS WEB--------------------.pptx
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
 
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialCatalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
 

Patrón de diseño Criteria

  • 1. WWW.PRACTICASDESOFTWARE.COM.AR Criteria Patrón de diseño Andrés Grosso – andres.grosso@engee.com.ar 20/09/2010 El patrón Criteria es una adaptación del patrón Specification y es utilizado para filtrar colecciones de objetos de una manera desacoplada.
  • 2. Criteria Andrés Grosso – andres.grosso@engee.com.ar Índice Definición ..................................................................................................................................................................................... 3 Propósito ..................................................................................................................................................................................... 3 Motivación ................................................................................................................................................................................... 3 Estructura .................................................................................................................................................................................... 4 Implementación ........................................................................................................................................................................... 6 Ejemplo ........................................................................................................................................................................................ 8 Referencias .................................................................................................................................................................................. 9 2
  • 3. Criteria Andrés Grosso – andres.grosso@engee.com.ar Definición Criteria 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. 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. 3
  • 4. Criteria Andrés Grosso – andres.grosso@engee.com.ar Estructura Estructura básica del patrón independiente del lenguaje de programación. A continuación se presentan dos maneras de representar la estructura del patrón. a) b) 4
  • 5. Criteria Andrés Grosso – andres.grosso@engee.com.ar Aquí se presenta para .NET c) 5
  • 6. Criteria Andrés Grosso – andres.grosso@engee.com.ar Implementación Implementación específica para .NET, la cual utiliza métodos de extensión en lugar de la clase abstracta de “CompositeCriteriaOOP”. Según la necesidad específica para cada caso, se puede determinar que si ya se encuentra un objeto que cumple con el criterio se salga del resto de los criterios anidados (como en este ejemplo), teniendo como objetivo final devolver siempre un único objeto. En el caso de que se necesite que devuelva todos los ítems que cumplen con el criterio, sea 1 o más, se debe modificar la implementación del método “MeetCriteria” de la clase “AndCriteria”. public interface ICriteria<E> { List<E> MeetCriteria(List<E> entities); } internal class AndCriteria<E> : ICriteria<E> { private ICriteria<E> _criteria; private ICriteria<E> _otherCriteria; internal AndCriteria(ICriteria<E> criteria, ICriteria<E> otherCriteria) { _criteria = criteria; _otherCriteria = otherCriteria; } public List<E> MeetCriteria(List<E> entities) { var result = _criteria.MeetCriteria(entities); // // // // if Si ya devuelve 1, es que uno solo cumplio el criterio y no se ejecutan los ands anidados Si ya devuelve 0, es que ninguno cumplio con el criterio y no se ejecutan los ands anidados (result.Count == 0 || result.Count == 1) return result; return _otherCriteria.MeetCriteria(result); } } internal class OrCriteria<E> : ICriteria<E> { private ICriteria<E> _criteria; private ICriteria<E> _otherCriteria; internal OrCriteria(ICriteria<E> criteria, ICriteria<E> otherCriteria) { _criteria = criteria; _otherCriteria = otherCriteria; } 6
  • 7. Criteria Andrés Grosso – andres.grosso@engee.com.ar public List<E> MeetCriteria(List<E> entities) { List<E> firstCriteriaItems = _criteria.MeetCriteria(entities); List<E> otherCriteriaItems = _otherCriteria.MeetCriteria(entities); foreach (E otherCriteriaItem in otherCriteriaItems) { if(!firstCriteriaItems.Contains(otherCriteriaItem)) firstCriteriaItems.Add(otherCriteriaItem); } return firstCriteriaItems; } } internal class NotCriteria<E> : ICriteria<E> { private ICriteria<E> _criteria; internal NotCriteria(ICriteria<E> x) { _criteria = x; } public List<E> MeetCriteria(List<E> entities) { List<E> notCriteriaItems = _criteria.MeetCriteria(entities); foreach (E notCriteriaItem in notCriteriaItems) entities.Remove(notCriteriaItem); return entities; } } public static class CriteriaExtensionMethods { public static ICriteria<E> And<E>(this ICriteria<E> criteria, ICriteria<E> otherCriteria) { return new AndCriteria<E>(criteria, otherCriteria); } public static ICriteria<E> Or<E>(this ICriteria<E> criteria, ICriteria<E> otherCriteria) { return new OrCriteria<E>(criteria, otherCriteria); } public static ICriteria<E> Not<E>(this ICriteria<E> criteria) { return new NotCriteria<E>(criteria); } } 7
  • 8. Criteria Andrés Grosso – andres.grosso@engee.com.ar Ejemplo Suponiendo el escenario de un centro médico, donde por cada paciente hay una colección de ítems de atención, los cuales pueden ser indicaciones (laboratorio, rayos, radiografías, ect.) o turnos, el proceso que determina que turno e indicación deben ser atendidas primero, puede ser implementado con el patrón Criteria. Para este escenario de ejemplo, básicamente existen una colección de turnos e indicaciones para un paciente, y según ciertos criterios se debe elegir a un solo turno y una sola indicación. El turno e indicación que cumplan con los criterios serán los que primero realizará el paciente. static void Main(string[] args) { // Se generan 3 turnos para el paciente Juan Perez List<Turno> turnos = FillTestTurnos(); // Se generan 5 indicaciones para el paciente Juan Perez List<Indicacion> indicaciones = FillTestIndicaciones(); /* Se recomienda utilizar un factory para la creación de los criterios */ // Le da prioridad a los items que tengan el estado ‘ProximaAtencion’ ICriteria<Item> proxAtenc = new CriterioProximaAtencion(); // Le da prioridad a los items que tengan el flag de urgente en true ICriteria<Item> urgente = new CriterioUrgente(); // Le da prioridad al ítem con el menor orden cronológico ICriteria<Item> ordCron = new CriterioOrdenCronologico(); // Retorna unicamente los items que tengan por lo menos un consultorio habilitado // (que puedan ser atendidos) ICriteria<Item> consulHabil = new CriterioConsultorioHabiitado(); // Le da prioridad a las indicaciones que tengan el menor tiempo de espera ICriteria<Indicacion> tiemEsp = new CriterioTiempoEspera(); // Se crean los criterios de los turnos según orden y necesidad ICriteria<Item> turnosCriteria = consulHabil. And(proxAtenc). And(urgente). And(ordCron); // Se crean los criterios de las indicaciones según orden y necesidad ICriteria<Item> indicacionesCriteria = consulHabil. And(proxAtenc.And(urgente)). Or(tiemEsp.And(ordCron)); var turnos = turnosCriteria.MeetCriteria(turnos); var indicaciones = indicacionesCriteria.MeetCriteria(indicaciones); // En este ejemplo de uso del patrón, se necesita obtener un sólo turno y una sola // indicación. Con lo cual las colecciones de turnos e indicaciones tendrán siempre // un único ítem. var turno = turnos.FirstOrDefault(); var indicacion = indicaciones.FirstOrDefault(); Console.WriteLine(string.Format("El Turno que será atendido es el {0}", turno.idTurno)); Console.WriteLine(string.Format("La indicacion que será atendida es {0}", indicacion.idIndicacion)); Console.ReadLine(); } 8
  • 9. Criteria Andrés Grosso – andres.grosso@engee.com.ar Referencias - http://martinfowler.com/apsupp/spec.pdf 9