Работа со списками данных #
Васильев Андрей Михайлович, 2025
Версии презентации
Работа с большим объёмом информации #
При работе с большим объёмом информации возникает ряд проблем:
- Весь объём данных для отображения слишком большой
- Сервер будет долго формировать и обрабатывать весь набор данных
- Клиентскому приложению надо будет эти данные получить (и в плохом случае оплатить мобильный трафик)
- Клиентскому приложению надо данные отобразить пользователю удобным образом
- Сервер будет долго формировать и обрабатывать весь набор данных
- Системе в большинстве случаев не выгодно предоставлять все свои данные
Для обеспечения удобного доступа к большому объёму данных пользователю предоставляются инструменты для выполнения:
- фильтрации
- сортировки
- постраничного ввода информации
Фильтрация и сортировка сервером #
- Фильтрация — выбор элементов из списка согласно какому-то свойству
- По конкретному значению (хочу 10k-телевизор)
- По границам возможных значений (до 10 т.р.)
- Сортировка — расположение элементов в списке согласно свойству
- По дате доставки (хочу вчера)
Обработка GET-запроса #
- Сервер определяет список параметров
- Сервер должен информировать клиента, если параметры не содержат нужных данных
- Разработчик клиента должен знать список известных серверу параметров
Постраничный вывод информации #
Даже после выполнения фильтрации объём данных скорее всего слишком большой для передачи пользователю, да и сервер не хочет отдавать все свои данные
Общепринятое решение — передача данных блоками, страницами
- При выполнения запросов без параметров отдаётся первая страница
- В HTTP-запросе могут быть указаны параметры для получения отдельной страницы
Обработчик запроса должен учитывать все параметры: сначала выполнить фильтрацию, затем отобразить нужную страницу
Параметры постраничного вывода обычно являются необязательными со значением по умолчанию
Идентификация элементов в списке #
При выполнении фильтрации и сортировки порядок элементов в массиве скорее всего не будет соответствовать изначальному:
- Данными для отображения будет массив из элементов с порядковыми номерами 64, 44 и 8 в оригинальном массиве
- В выдаче-списке необходимо давать возможность найти полную информацию
- Порядковый номер в массиве не может являться надёжным средством идентификации
- Уникальный идентификационный номер должен являться частью элемента
Обеспечение уникальности #
В приложении появляется потребность в классе-хранилище, элементов, который
- Обеспечит быстрый доступ к элементу по его внутреннему номеру
- Обеспечит уникальность внутренних идентификаторов элементов в системе
class TriangleStorage() {
private val triangles: ...
fun add(triangle: Triangle): Int { ... }
fun get(id: Int): Triangle? { ... }
}
При добавлении нового элемента в хранилище либо
- У него устанавливается новое значение уникального идентификатора
- Запрещается добавление элемента, если у него не уникальный номер
Хранилище может предоставлять функции для получения всех элементов в виде списка, для выполнения операций фильтрации и т.д.
Обработка запроса от пользователя #
Обработку запроса от пользователя можно разделить на три логических этапа, следующих один за другим:
- Техническая обработка данных, пришедших от пользователя. Данные приходят в формате строк, необходимо их преобразовать к типам слоя предметной области
- Выполнение обработки извлечённых данных в слое предметной области: поиск значений, добавление значений, изменение значений и т.д.
- Формирование ответа пользователю в формате, который он ожидает
В рамках обработки HTTP-запроса может быть выполнено несколько обращений к каждому из слоя извлечения данных и слоя предметной области
Рекомендуется каждый этап оформлять внутри отдельного компонента, а задачей HTTP-обработчика становится их логическое объединение для достижения задачи