Работа со списками данных

Работа со списками данных #

Васильев Андрей Михайлович, 2025

Версии презентации


Работа с большим объёмом информации #

При работе с большим объёмом информации возникает ряд проблем:

  • Весь объём данных для отображения слишком большой
    • Сервер будет долго формировать и обрабатывать весь набор данных
      • Клиентскому приложению надо будет эти данные получить (и в плохом случае оплатить мобильный трафик)
    • Клиентскому приложению надо данные отобразить пользователю удобным образом
  • Системе в большинстве случаев не выгодно предоставлять все свои данные

Для обеспечения удобного доступа к большому объёму данных пользователю предоставляются инструменты для выполнения:

  • фильтрации
  • сортировки
  • постраничного ввода информации

Фильтрация и сортировка сервером #

diagram

  • Фильтрация — выбор элементов из списка согласно какому-то свойству
    • По конкретному значению (хочу 10k-телевизор)
    • По границам возможных значений (до 10 т.р.)
  • Сортировка — расположение элементов в списке согласно свойству
    • По дате доставки (хочу вчера)

Обработка GET-запроса #

diagram

  • Сервер определяет список параметров
  • Сервер должен информировать клиента, если параметры не содержат нужных данных
  • Разработчик клиента должен знать список известных серверу параметров

Постраничный вывод информации #

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

Общепринятое решение — передача данных блоками, страницами

  • При выполнения запросов без параметров отдаётся первая страница
  • В HTTP-запросе могут быть указаны параметры для получения отдельной страницы

Обработчик запроса должен учитывать все параметры: сначала выполнить фильтрацию, затем отобразить нужную страницу

Параметры постраничного вывода обычно являются необязательными со значением по умолчанию


Идентификация элементов в списке #

При выполнении фильтрации и сортировки порядок элементов в массиве скорее всего не будет соответствовать изначальному:

diagram

  • Данными для отображения будет массив из элементов с порядковыми номерами 64, 44 и 8 в оригинальном массиве
  • В выдаче-списке необходимо давать возможность найти полную информацию
  • Порядковый номер в массиве не может являться надёжным средством идентификации
  • Уникальный идентификационный номер должен являться частью элемента

Обеспечение уникальности #

В приложении появляется потребность в классе-хранилище, элементов, который

  • Обеспечит быстрый доступ к элементу по его внутреннему номеру
  • Обеспечит уникальность внутренних идентификаторов элементов в системе
class TriangleStorage() {
    private val triangles: ...

    fun add(triangle: Triangle): Int { ... }
    fun get(id: Int): Triangle? { ... }
}

При добавлении нового элемента в хранилище либо

  • У него устанавливается новое значение уникального идентификатора
  • Запрещается добавление элемента, если у него не уникальный номер

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


Обработка запроса от пользователя #

diagram


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

  1. Техническая обработка данных, пришедших от пользователя. Данные приходят в формате строк, необходимо их преобразовать к типам слоя предметной области
  2. Выполнение обработки извлечённых данных в слое предметной области: поиск значений, добавление значений, изменение значений и т.д.
  3. Формирование ответа пользователю в формате, который он ожидает

В рамках обработки HTTP-запроса может быть выполнено несколько обращений к каждому из слоя извлечения данных и слоя предметной области

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

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su