Узнайте, как создать систему генерации отчетов многократного использования с использованием шаблона проектирования.

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

Правильно - посмотрите.

У инженеров проблемы с отчетами

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

Они получат такое требование, как «создать отчет в формате .csv, в котором отображаются все товары, приобретенные в магазине», и они пойдут и создадут именно эту функцию.

В следующий раз они могут получить запрос на «создать отчет в формате .csv обо всех пользователях, принадлежащих учетной записи», и они также пойдут и создадут эту функцию.

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

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

Что такое отчет?

Во-первых, давайте разберемся - что такое отчет? Каждый отчет состоит из четырех основных компонентов:

  • записи данных
  • значения данных
  • этикетки
  • формат

Записи данных

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

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

Значения данных

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

Этикетки

Ярлыки придают смысл данным. Вот что отличает это…:

5 | 3 | 230 | 40

…из этого:

id | event_id | amount_paid_cents | fee_paid_cents
5  | 3        | 230               | 40

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

Формат

И, наконец, формат отчета. Формат может быть произвольным, а какой формат нужен, в конечном итоге зависит от потребителя. Если потребителем является API, формат может быть JSON.

Если клиент является FTP-клиентом или лицом, намеревающимся импортировать его в другую систему, это может быть CSV. Если потребитель - это специалист по данным, заинтересованный в нарезке и нарезке кубиками, он может оказаться в виде электронной таблицы Excel или даже в виде набора команд импорта базы данных.

Каковы этапы создания отчета?

Теперь, когда мы знаем детали, мы можем взглянуть на алгоритм: какова последовательность шагов, необходимых для создания любого вида отчета?

Оказывается, это несложный алгоритм! Его можно инкапсулировать в следующее:

  • Настройка - получить параметры для отчета
  • Получение записей
  • Карта - получить определенный набор полей из каждой записи.
  • Преобразуйте каждый набор полей в запись в отчете
  • Отправить отчет обратно пользователю

Настраивать

Первым шагом является настройка - отправка параметров в отчет для корректировки его поведения. Это часто данные, используемые для определения объема -. Некоторая коллекция записей должна быть отфильтрована и уменьшена до подмножества (например, по учетной записи, по дате и т. Д.)

Принести

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

карта

Скорее всего, вас интересует определенный набор атрибутов и полей в записи. Вы можете превратить свои записи в этот конкретный набор и при желании обогатить каждую запись дополнительными данными.

Перерабатывать

Создав коллекцию - в данном случае набор хешей - вы захотите преобразовать ее в определенный формат, например CSV.

Хотите поддерживать другие форматы? Без проблем:

Собираем все вместе

Каждый из вышеперечисленных шагов может иметь свои собственные детали, но обычно вы можете инкапсулировать его во что-то вроде ниже:

Реализация для конкретного варианта использования может выглядеть так:

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

Если это кажется знакомым - это потому, что это могло быть просто так!

Это шаблон шаблона - шаблон проектирования, который помогает инкапсулировать последовательность алгоритма и реализацию инвариантных шагов, оставляя варианты шагов доступными для «заполнения» подклассом.

Дополнительные итерации

Есть много других проблем и возможных повторений отчета, например:

  • Производительность - пакетирование записей, управление размером записи
  • Настройка - указание заголовков, изменение порядка
  • Доставка - SFTP, загрузка, электронная почта

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

Например, если у вас уже есть модуль, который доставляет файлы по электронной почте, вы можете легко подключить выходные данные своего генератора отчетов к этой подсистеме или вызвать его из такой функции, как deliver_to_email(email).

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