Система создания отчетов (Text Report System)

Опубликовано May 24, 2013 в Тестовые проекты (2-3 часа) | 5 коммент.

, ,

Система создания отчетов (Text Report System)

Тестовое задание: система создания отчетов

Данное задание долгое время служило нам верой и правдой – по результатам его выполнения мы приняли на работу несколько разработчиков. И вот пришло время его опубликовать вместе с нашим вариантом решения. Кроме того будут  рассмотрены типичные способы реализации, которые мы считаем ошибками или недочетами.

Постановка задачи

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

Входные данные

  • Файл с шаблоном отчета.
  • INI-файл, содержащий значения текстовых параметров. Формат этого файла – произвольный и подразумевается, что ошибок форматирования в нем не будет.

Выходные данные

  • Файл со сгенерированным отчетом (можно отчет выводить просто на  экран через cout).
  • Лог-файл, содержащий сообщения об ошибках и записи об успешной генерации отчета (лог-файл также можно  выводить просто на  экран через cout).

Файл “Шаблон отчета”

Шаблон отчета – это простой текстовый файл. Проблему локализации можно не решать – все на английском. В этом файле в произвольном тексте размещены параметры в виде следующей конструкции:

Можно считать, что символы “{}” никогда не появляются в произвольном тексте.

Обязательные параметры отмечаются символом “*”. Обязательным является тот параметр, без значения которого отчет генерироваться не должен. Для обязательных текстовых параметров их значение обязательно должно присутствовать в INI-файле.  Если параметр не является обязательным и его значение не удалось получить – в отчет вставляется пустая строка.

Ниже приведен пример шаблона отчета

Здравствуйте {*user_name},

Большое спасибо, что вы решили воспользоваться услугами нашей компании.
Ваш заказ номер {*order_number} будет доставлен через 10 рабочих дней после {current_date}.

 С Уважением, Администрация интернет магазина.

 Типы параметров отчета

Параметры отчета могут быть двух видов

  • Текстовые параметры. В этом случае для работы с ними достаточно совпадения имени параметра в файле шаблона отчета и в INI-файле, если параметр обязательный.
  • Функциональные параметры. Представляют собой результат вызова предопределенной функции.  Допустимы только зарегистрированные в программе имена подобных параметров, каждому из которых соответствует вызов определенной функции. При попадании имени функционального параметра в INI-файл должна генерироваться ошибка, а отчет не создается. (В рамках тестового задания должна быть реализована только одна функция – возвращающая current_date. Формат даты времени – произвольный, такой как вернет системная функция, ничего менять не нужно).

Необходимо разработать структуру данных для хранения параметров в памяти и регистрации функциональных параметров. Для экономии времени – инициализация параметров может быть выполнена прямо в коде С++ (без чтения из INI-файла).

Логирование

Как часть проекта необходимо разработать класс, реализующий функциональность логирования. Для простоты лог сообщений и ошибок может выводиться на экран через cout. Логируется факт успешной генерации отчета и перечисленные ниже ошибки.

  • Если в процессе генерации отчета любой из обязательных параметров не получил значения.
  • Если имя зарегистрированного функционального параметра попало в INI-файл.
  • Если вызов функции, инициированный функциональным параметром привел к ее внутреннему исключению.

При возникновении любой из этих ошибок отчет не создается, работа прекращается после обнаружения первой по ходу дела ошибки.

Возможные дополнительные вопросы

  • Как бы вы реализовали хранение параметров в шаблоне отчета при условии, что символы “{}” могут присутствовать в произвольном тексте?
  • Как расширить вашу реализацию для добавления новых типов параметров?

Автор публикации: