В компании недавно был релиз новой версии продукта. За несколько часов до релиза один разработчик выпонил блокирующую задачу и спас релиз (не спрашивайте как), но качество этого кода оставляет желать лучшего.
Чтобы закрыть техдолг, необходимо кардинально улучшить качество кода.
В файле 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закрыт на чтение, когда пустые данные, когда не поддерживаемые данные