Skip to content

Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке

Notifications You must be signed in to change notification settings

watisluv1910/school2024-test-task1

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке

Условие задания

Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику.

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

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

Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию:

  • Идентификатор пользователя;
  • Дата и время оформления заказа;
  • Статус заказа;
  • Сумма заказа.

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

  • COMPLETED (Завершенный заказ);
  • CANCELED (Отмененный заказ);
  • CREATED (Созданный заказ, еще не оплаченный);
  • DELIVERY (Созданный и оплаченный заказ, который доставляется).

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

Требования к реализации:

  1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом;
  2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания;
  3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата:
    • {«months»: [«march»]}
    • {«months»: [«march», «december»]}
  4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.

Автор решения

Насевич Владислав Викторович.

Описание реализации

Основной класс программы - Formatter. В нём по ходу обработки файла и преобразования данных вызываются методы из вспомогательных классов, о которых далее:

  1. FileUtils - отвечает непосредственно за чтение данных из JSON-файла. Используется в классе OrderService для получения JSON-строки из файла (в связке с JsonUtils).
  2. JsonUtils - отвечает за все операции, связанные непосредственно с представлением данных в формате JSON, а именно их сериализацию и десериализацию. Также имеет методы форматирования.
  3. OrderService - объединяет в себе все операции, связанные непосредственно с заказами и более узко направленные комбинации методов классов FileUtils и JsonUtils (так как классы FileUtils и JsonUtils предоставляют лишь максимально обобщённые методы для работы с относящимися к ним сущностям). Включает в себя методы, необходимые для вычисления конечного результата и вызывающиеся напрямую из main метода класса Formatter.

Как уже было упомянуто ранее, метод main класса Formatter собирает решение воедино, напрямую взаимодействуя только с OrderService и, в исключительном случае, для форматирования результата вычислений, с JsonUtils.

Также в проекте реализован механизм логирования с помощью Logback. При возникновении ошибки stacktrace записывается в файл, а в консоль выводиться лаконичное сообщение, описывающее суть возникшей проблемы.

Проект собирается и запускается с помощью Maven (maven-jar-plugin и maven-exec-plugin соответственно), однако также имеется возможность компиляции в jar-with-dependencies для дальнейшего запуска без Maven.

Инструкция по сборке и запуску решения

Для тестирования работы приложения необходимо выполнить следующие шаги:

  1. Установить Java версии >= 21, если необходимо.
  2. Клонировать репозиторий:
    git clone [email protected]:watisluv1910/school2024-test-task1.git
  3. Перейти в root-директорию проекта и выполнить следующие команды:
    Для Unix-подобных систем:
    ./mvnw clean package
    Для Windows:
    mvnw.cmd clean package
  4. Для запуска приложения с тестовым файлом выполнить (стандартным расположением файла является корневая директория проекта):
    Для Unix-подобных систем:
    ./mvnw -q exec:java
    Для Windows:
    mvnw.cmd -q exec:java
    Для запуска с переопределением стандартного пути к файлу с данными (необходимо заменить /path/to/file на фактический путь к файлу):
    Для Unix-подобных систем:
    ./mvnw -q exec:java -Dexec.args="/path/to/file"
    Для Windows:
    mvnw.cmd -q exec:java -Dexec.args="/path/to/file"

About

Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%