Узнайте, как создать систему генерации отчетов многократного использования с использованием шаблона проектирования.
Отчеты. Часто это одна из первых функций, которые разработчики просят создать в компании. Что они хотят с ними делать, когда у кого-то есть данные?
Правильно - посмотрите.
У инженеров проблемы с отчетами
Многие инженеры подходят к отчетам с учетом конкретных вариантов использования.
Они получат такое требование, как «создать отчет в формате .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).
Вот и все! Создание программного обеспечения многократного использования, которое отделяет механизм от варианта использования, позволяя использовать его во многих других вариантах использования, так же просто, как разбить его на мелкие части и тщательно продумать входные и выходные данные.