В компании недавно был релиз новой версии продукта. За несколько часов до релиза один разработчик выпонил блокирующую задачу и спас релиз (не спрашивайте как), но качество этого кода оставляет желать лучшего.
Чтобы закрыть техдолг, необходимо кардинально улучшить качество кода.
В файле sources/example.cpp лежит код, который необходимо улучшить. Не обращайте внимание на бессмысленность кода.
- Реализуйте юнит-тестирование класса
PageContainer
:
- удостоверьтесь, что в случае исключения, члены класса не модифицируются
- удостоверьтесь, что метод
AsyncSend
будет вызывается всегда, когда изменяются данные при загрузке - удостоверьтесь, что метод
AsyncSend
будет вызывается всегда, при пропуске элемента - удостоверьтесь, что в случае некорректных данных в
istream
процесс загрузкиLoad
будет работать корректно (пропускать данные)
- Реализуйте юнит-тестирование класса
UsedMemory
:
- удостоверьтесь, что класс
UsedMemory
корректно подсчитывает используемую память
- Произведите рефакторинг существующего кода, без изменения логики программы
- Перейдите на использование
boost::program_options
- Добавьте возможность задавать параметр
threshold
из командной строки - Добавьте класс
Histogram
:
- который сохраняет в память среднее значение
score
всех загруженных объектов в методахLoad
иReload
- который сохраняет в память сколько было отброшено элементов по параметру
threshold
за каждый вызов методовLoad
иReload
(каждый новый вызов методаLoad
/Reload
создает новое значение)
- Нельзя использовать сторонние библиотеки кроме
boost::program_options
- Подойдите критично к существующему коду
- Используйте gtest::mock
- Не пугайтесь, если придется использовать динамический полиморфизм при рефакторинге или при тестировании
- Ниже есть некоторые мысли что можно улучшить, но хорошему студенту сначала рекомендуется выпонить работу самостоятельно, а затем свериться с подсказками.
Список может быть не полным! Скорее всего вам придет в голову лучшие решения, чем ниже приведенные.
- Класс
Log
сделайте через синглтон - Используйте шаблон "Наблюдатель":
PageContainer
- уведовляет о событиях:OnDataLoaded
,OnRawDataLoaded
,OnSkipped
- Классы
UsedMemory
,StatSender
- наблюдателями
- метод
AsyncSend
стоит сделать виртуальным, чтобы проверить что он вызывается в нужных местах - Класс
Histogram
так же следует реализовать как наблюдателя классаPageContainer
- проверьте в юнит-тестировании случаи когда
istream
закрыт на чтение, когда пустые данные, когда не поддерживаемые данные