ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 03.12.2023
Просмотров: 44
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Санкт-Петербургский Политехнический Университет
Институт компьютерных наук и технологий
«Высшая школа программной инженерии»
Курсовое проектирование
по дисциплине: «Технологии разработки качественного программного обеспечения»
по теме: «Фитнес-трекер»
Выполнил:
студент гр. в3530904/00321 Мельник Е. В.
Руководитель: Смирнов Н. Г.
Санкт-Петербург
2023
СОДЕРЖАНИЕ
1 ВВЕДЕНИЕ 3
1.1 Цель работы 3
1.2 Постановка задачи 3
2 Архитектура приложения 4
2.1 Диаграмма классов 4
2.2 Диаграмма компонентов 7
2.3 Диаграмма последовательностей 7
3 Работа программы 8
4 Тестирование 12
5 Вывод 14
ПРИЛОЖЕНИЕ 15
Main 15
WorkoutSession 15
Profile 20
Training 21
TestWorkout 21
1 ВВЕДЕНИЕ
1.1 Цель работы
Целью данной курсовой работы является создание программного продукта «Фитнес-трекер», удовлетворяющего следующему описанию:
Приложение позволяет указать вид тренировки: отжимание, скакалка, приседания. Доступны такие команды, как: начать тренировку (запомнить время начала) и закончить тренировку (запомнить время окончания). За отработанное время высчитывается количество потраченных калорий по формуле: K - количество калорий в час, затрачиваемое на определенный вид тренировки, умножается на t – продолжительность тренировки в часах. От запуска к запуску программы данные должны сохраняться и общее количество калорий - суммироваться. Для этого необходимо создать файл с обращением к нему при помощи операций сериализации и десериализации.
1.2 Постановка задачи
Приложение должно удовлетворять следующим требованиям:
-
Программа считывает файл с серилизованными данными профилей пользователей; -
Пользователь может создавать новые профили и выбирать уже существующие; -
Пользователь выбирает номер интересующей его тренировки при помощи клавиатуры; -
Спустя некоторое время пользователь обязан ввести «stop» для завершения тренировки и фиксации времени её окончания; -
После завершения тренировки данные о сожженных калориях и затраченном времени записываются в профиль; -
При вводе завершении тренировок программа завершает свою работу и сохраняет данные в файл;
2 Архитектура приложения
2.1 Диаграмма классов
UML-диаграмма классов данного приложения состоит из четырёх компонентов, которые можно рассмотреть на рисунке 1.
-
Класс «Main» содержит в себе только один метод «main()», который создаёт экземпляр класса «Workout Session» и вызывает у него метод «run»
-
Класс «WorkoutSession» содержит методы для отслеживания и записи тренировок пользователя.
В классе определены следующие методы:
-
isInteger() - проверяет, является ли объект типа Integer. Если это так, метод возвращает true. Если объект не является типом Integer, метод преобразует его в строку и пытается преобразовать в целое число. Если это возможно, метод также возвращает true, в противном случае метод возвращает false. -
readUsers() - читает список пользователей из файла users.out, если он существует. Если файл не существует, метод ничего не делает. Десериализация объектов производится с помощью класса ObjectInputStream. -
login() - спрашивает у пользователя, есть ли у него профиль. Если ответ "y", список доступных профилей отображается на экране, и пользователь должен выбрать один. Если ответ "n", пользователю будет предложено написать свое имя и создать новый профиль. -
process() - позволяет пользователю выбрать тренировку из списка, начать ее и записать результаты. Сначала пользователю будет предложено выбрать тренировку из списка доступных тренировок. Затем пользователю будет предложено начать тренировку. Если пользователь начал тренировку, ему будет предложено записать время, которое он потратил на тренировку, и количество калорий, которое он сжег во время тренировки. Затем пользователю будет предложено продолжить тренировку или закончить. Если пользователь решил продолжить, процесс начнется заново. Если пользователь решил закончить, его результаты будут добавлены в его профиль. -
run() - выполняет следующие действия: Создает ArrayList объектов Training с помощью метода createWorkout(). Инициализирует новый ArrayList объектов Profile в переменной users. Считывает существующих пользователей с помощью метода readUsers(). Просит пользователя ввести свои учетные данные для входа в систему с помощью метода login(). Обрабатывает тренировку с помощью метода process(), используя объект workout. Записывает обновленную информацию о пользователях в файл users.out с помощью FileOutputStream и ObjectOutputStream. Если при выполнении метода возникнет ошибка ввода-вывода (IOException), некорректное имя (InvalidNameException) или проблема с десериализацией объекта (ClassNotFoundException), метод сгенерирует соответствующее исключение и вызовет их вверх по стеку вызовов.
Также класс содержит два поля: userId (идентификатор пользователя) и users (список профилей пользователей).
-
Класс «Training» содержит методы для отслеживания и записи тренировок пользователя также содержит три поля: type, calPerHour и allCal.
Конструктор класса принимает два аргумента: type (тип тренировки) и calPerHour (количество калорий, которое сжигается за час при выполнении данной тренировки). Значения этих аргументов используются для инициализации соответствующих полей класса.
В классе определены следующие методы:
-
getCalPerHour() - возвращает количество калорий, которое сжигается за час при выполнении данной тренировки. -
display() - выводит тип тренировки на экран. -
getType() - возвращает тип тренировки. -
clear() - устанавливает значение поля allCal в ноль.
-
Класс «Profile» представляет профиль пользователя, который может отслеживать время и количество потраченных калорий. Он имплементирует интерфейс Serializable, что означает, что объекты этого класса могут быть сериализованы и десериализованы, для сохранения в файле.
Класс содержит три поля:
-
name - строка, которая хранит имя пользователя; -
allCal - число типа double, которое хранит общее количество потраченных калорий; -
allTime - число типа double, которое хранит общее время тренировок пользователя.
Класс имеет несколько методов для управления этими полями:
-
addTime() - добавляет время тренировки в общее время пользователя; -
addCal() - добавляет количество потраченных калорий в общее количество потраченных калорий пользователя; -
getName() - возвращает имя пользователя; -
getTime() - возвращает общее время тренировок пользователя; -
getCal() - возвращает общее количество потраченных калорий пользователя.
Рисунок 1 – UML-диаграмма классов
2.2 Диаграмма компонентов
Данная диаграмма состоит из двух компонентов: WorkoutSession, где происходит функционирование всей логики программы, users.out – содержащий информацию по всем профилям. После запуска приложения, WorkoutSession считывает информацию из файла и хранит её. Запись новых данных и обновление информации о уже существующих профилях
, происходит по завершению программы. Вышеописанная схема представлена на рисунке 2.
Рисунок 2 – UML-диаграмма компонентов
2.3 Диаграмма последовательностей
На диаграмме последовательности показан жизненный цикл программы.
В начале происходит запуск приложения, создание и старт тренировочной сессии. Далее пользователь должен либо создать новый профиль, либо выбрать уже существующий. Далее пользователю предоставляется выбор упражнения. Если ввод совершён правильно, то начинается тренировка. После ввода сообщение об окончании тренировки происходит вывод информации о ней на экран. Затем, цикл работы программы может быть повторён.
Если пользователь пожелает корректно завершить работу приложения, тогда следует отказаться от продолжения тренировки при соответствующем запросе, после чего программа будет завершена и его профиль, с результатами тренировки, будет сохранён в файл.
Временная диаграмма продемонстрирована на рисунке 3.
Рисунок 3 – UML-диаграмма последовательностей
3 Работа программы
При запуске приложения пользователю будет предложено создать нового пользователя или выбрать уже существующего. Если при считывании файла с пользователями, не было обнаружено ранее созданных пользователей, будет существующее сообщение, показанное на показанное на рисунке 4.
Рисунок 4 – Сообщение если в файле не обнаружено пользователей
При создании нового профиля, пользователь просто вводит его имя и в дальнейшем его можно выбирать его из списка доступных профилей. Процесс создания и выбора нового профиля показан на рисунке 5.
Рисунок 5 – Создание и выбор нового профиля
Далее пользователю выводится список доступных упражнений, которые выбираются вводом из порядкового номера, после выбора упражнения, последует запрос на подтверждение выбора и при положительном ответе, тренировка начнётся. Процесс выбора и начала тренировки показан на рисунке 6.
Рисунок 6 – Процесс выбора и начала тренировки
Для завершения выполнения упражнения, пользователь должен ввести “stop”, после чего будут выведено затраченное время и сожжённые в результате упражнения калории. Результат выполнения приседаний показан на рисунке 7.
Рисунок 7 – Результат выполнения приседаний в течении пары минут
Далее пользователь может завершить тренировку или выбрать новое упражнение. На рисунке 8 показано продолжение тренировки и выбор прыжков через скакалку в качестве нового упражнения.
Рисунок 8 – переход к прыжкам через скакалку
Если по завершению упражнения отказаться от продолжения тренировки, итоговый результат будет выведен пользователю и записан в его профиль. На рисунке 9 показано как это выглядит.
Рисунок 9 – Завершение тренировки
При повторном запуске программы, ранее созданный профиль и данные о тренировках в нём, будут доступны пользователю. На рисунке 10 показано как это выглядит.
Рисунок 10 – Выбор ранее созданного профиля
4 Тестирование
Для тестирования приложения был создан тест класс содержащий следующие методы:
-
testFunc():
-
Внутри метода сначала создается экземпляр класса WorkoutSession, затем происходят проверки: -
Вызывается метод isInteger с аргументом "q", и ожидается, что метод вернет false. То есть тестируется, что метод корректно определяет, что "q" не является целым числом. -
Вызывается метод createWorkout, который создает список объектов типа Training. Затем происходит проверка, что каждый объект в списке имеет поле calPerHour, значение которого больше или равно нулю. То есть тестируется, что метод createWorkout корректно создает список объектов Training с правильными значениями свойств.
-
testAfterWork():
-
Получается текущий путь к файлу и создается строка с именем файла "users.out". Затем создается объект File для этого файла и проверяется, существует ли файл. Если файл не существует, то тест не пройден. -
Создается новый пустой список ArrayList объектов типа Profile. Затем открывается файл "users.out" для чтения данных в бинарном формате. В цикле while читаются объекты из файла, которые должны быть списками Profile, и добавляются в список users. Цикл продолжается до тех пор, пока не достигнут конец файла или пока не возникнет исключение. -
После чтения данных из файла происходит проверка, что размер списка users не равен 0. Если список пустой, то тест не пройден.