Шаблон разработки для фильтрации набора объектов?

Архитектура программного обеспечения включает в себя, помимо прочего, бизнес-представление (описание бизнес-процессов) и системное представление (описание системы). Вариант бизнес-использования описывает функциональность бизнес-представления, а сценарий системного использования описывает функциональность системного представления. Бизнес-сценарий имеет свой графический стереотип в стандарте UML.

15
задан 2 revs 26 October 2009 в 21:59
поделиться

5 ответов

На самом деле немного сложно указать, что вы хотите, поэтому я возьму свои собственные предположения.

  1. Базовая коллекция не должна измениться после фильтрации
  2. Результат не настойчивый

Классический подход - использование представлений . По сути, это ленивое программирование , когда вы создаете объект, который может получить доступ к исходной коллекции и знает, какой фильтр применять, но не будет производить никаких вычислений, пока ничего не требуется.

В коллекциях представления часто реализуются с итераторами , а для фильтрации, конечно, с шаблоном стратегии, как уже указывалось.

Например:

Collection myCollection;
Predicate myFilter;

// Nothing is computed here
View<Predicate> myView(myCollection, myFilter);

// We iterate until we find the first item in the collection that satisfies
// the Predicate, and no more, to initialize `begin`
View<Predicate>::Iterator begin = myView.begin(), end = myView.end();

Чистое преимущество состоит в том, что если вам (скажем) нужно только 10 сначала элементы, затем вы примените предикат столько, сколько необходимо, чтобы сначала найти эти 10, и не более того.

Кроме того, нет копии задействованных элементов, и ваше представление гарантированно будет обновлено, даже если вы измените myCollection , хотя это может повлиять на действительность итераторов (как обычно ).

Проблема в том, что (если вы не реализуете кеширование) результат вычисляется каждый раз.

Если вы хотите получить более стойкий результат, вам лучше создать новую коллекцию, содержащую только отфильтрованные элементы (или ссылки на них). Здесь нет общего шаблона, поскольку это зависит от того, как вы хотите использовать «фильтрованный» список.

Что касается предложенного шаблона стратегии, вы обычно можете построить свой фильтр по блокам, используя составной шаблон, а затем передать построенный таким образом объект в качестве стратегии.

Составной шаблон особенно подходит для представления результата проанализированного выражения, например,

6
ответ дан 1 December 2019 в 05:02
поделиться

Вы ищете реляционную базу данных, из которой можно использовать SQL. Вы можете создать полную базу данных и подключиться к ней из своего приложения, или вы можете сделать что-то среднее между полной базой данных и прямыми объектами. В Java, например, вы можете использовать базу данных в памяти, такую ​​как HSQLDB / JavaDB, и использовать ее возможности. Вы также можете использовать JoSQL , который позволит вам работать в SQL непосредственно с вашими объектами, вообще без базы данных.

В качестве альтернативы, если вы хотите запрограммировать вещь самостоятельно, вы должны начать с хранения двух копий ваши данные. Один - ваш полный набор данных, другой - ваше представление данных после фильтрации. Затем вы должны создать индекс для своих данных для каждого столбца, сортируя данные и сохраняя их позицию в отсортированном списке. Такая же настройка работает для соответствия фильтру. Если что-то соответствует фильтру для столбца, присвойте ему 1 или 0, если нет. Затем, когда кто-то меняет порядок сортировки, вы копируете свои данные из полного списка в список просмотра или когда меняете информацию о фильтре, вы берете только те данные, которые имеют совпадение.

1
ответ дан 1 December 2019 в 05:02
поделиться

Я не знаю о шаблоне проектирования для этого, но вы можете посмотреть на некоторые подходы, которые были созданы для сортировки, и было бы полезно, если бы вы объяснили некоторые из них и в качестве примера, почему они вам не понравились.

Например, в LINQ есть хороший способ сортировки с использованием деревьев выражений.

Вы также можете посмотреть на сортировку, выполненную на функциональных языках, где вы можете передать функция, которая фактически выполняет сортировку, а не жестко кодирует какую-либо конкретную сортировку.

Если бы вы работали с чем-то вроде javascript, тогда функцию сортировки можно было бы создать на лету.

1
ответ дан 1 December 2019 в 05:02
поделиться

Если эти отношения выражаются как RDF и OWL, вы можете использовать инструмент с конечной точкой SPARQL (например, Jena) или средство рассуждений, например Pellet. Но без дополнительных деталей неясно, что это лучший подход.

0
ответ дан 1 December 2019 в 05:02
поделиться

I like the filter with predicate of Google Collections and I would implement something very similar if I couldn't use it. You may want to check this answer to a similar question for a implementation example. The implementation is in Java but, well, you'll see the pattern.

1
ответ дан 1 December 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: