Существует ли общий шаблон дизайна для создания страницы класса коллекции? - PullRequest
1 голос
/ 11 января 2010

Я неоднократно сталкивался с этой проблемой проектирования и задавался вопросом, существует ли общий шаблон проектирования ООП, который ее устраняет.

Проблема разработки: мне нужно реализовать класс, представляющий коллекцию объектов, которые могут стать довольно большими. По соображениям производительности, уровень представления данных будет представлять данные на отдельных страницах, запрашивая только небольшое подмножество объектов за один раз, когда пользователь перемещается по данным. В идеале объект должен выборочно запрашивать БД по требованию, а не предварительно загружать все в память, когда очень вероятно, что для действительно больших коллекций клиент / пользователь никогда не будет запрашивать все данные в коллекции.

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

Существует ли общий шаблон проектирования ООП для реализации объекта, который позволяет клиенту извлекать данные по одной странице за раз и умно запрашивает данные с уровня данных только по мере необходимости?

Ответы [ 2 ]

4 голосов
/ 11 января 2010

Я бы расширил (или создал) класс Iterator и добавил бы параметр конструктора, который определяет количество элементов на странице, и добавил бы метод nextPage (), который возвращает коллекцию соответствующего размера (или меньше, если его недостаточно). элементы для заполнения страницы).

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

Шаблон Iterator находится в книге GoF, если вам нужна ссылка.

1 голос
/ 11 января 2010

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

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

Например, на сервере SQL (с соответствующими индексами на месте) вы можете сделать это в одном сохраненном процессе, используя переменную Table для хранения отсортированного списка ключей и очень быстрого возврата любой страницы данных

...