Настраиваемая фильтрация/поиск
От: karbofos42 Россия  
Дата: 15.01.19 09:02
Оценка:
Допустим, есть некий алгоритм, который идёт по цепочке: город — район — улица — дом
По умолчанию он возвращает все дома всех городов.
Нужно фильтровать выборку по любому из уровней.
Допустим, нужно получить все дома номер 4.
Или же только дома с чётным номером из города с населением больше миллиона, с улицы Ленина.
Желательно при этом иметь минимум лишних проверок, чтобы при отсутствии фильтров для каждого города/района/улицы не проверялись все возможные условия.
Сейчас фильтр задаётся в виде Fluent:
Searcher
  .WhereCityName("Москва")
  .WhereCityPopulation(1000000)
  .WhereStreetName("Ленина")
  .Search();

внутри все проверки вынесены в делегаты: один делегат проверяет город, другой — улицу и т.д.
по умолчанию делегаты не заданы или возвращают true, т.е. что данный объект соответствует условиям и его нужно брать.
если задали ограничение, то делегат заменяется на соответствующий, который уже проверяет имя города или на другой делегат, который проверяет и имя и население или еще что-то более сложное.
Немного получше пожалуй будет, если делегаты заменить на объекты, реализующие интерфейс. Что-то типа:
interface ICityChecker
{
  bool Check(City city);
}

и добавлять уже реализации интерфейса.

Может есть какой нормальный вариант организации подобных вещей? а то как-то это всё не очень нравится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.