Работа со списками данных
#
Васильев Андрей Михайлович, 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-обработчика становится их логическое объединение для достижения задачи