Простейшим кирпичиком такой системы является задача (англ. task). У задачи есть следующие свойства:
- Название, кратко описывающее суть задачи (например, «Переезд»).
- Описание, в котором раскрываются детали.
- Уникальный идентификационный номер задачи, по которому её можно будет найти.
- Статус, отображающий её прогресс. Мы будем выделять следующие этапы жизни задачи:
- NEW — задача только создана, но к её выполнению ещё не приступили.
- IN_PROGRESS — над задачей ведётся работа.
- DONE — задача выполнена.
Иногда для выполнения какой-нибудь масштабной задачи её лучше разбить на подзадачи (англ. subtask). Большую задачу, которая делится на подзадачи, мы будем называть эпиком (англ. epic). Таким образом, в нашей системе задачи могут быть трёх типов: обычные задачи, эпики и подзадачи. Для них должны выполняться следующие условия:
- Для каждой подзадачи известно, в рамках какого эпика она выполняется.
- Каждый эпик знает, какие подзадачи в него входят.
- Завершение всех подзадач эпика считается завершением эпика.
Кроме классов для описания задач, вам нужно реализовать класс для объекта-менеджера. Он будет запускаться на старте программы и управлять всеми задачами. В нём должны быть реализованы следующие функции:
- Возможность хранить задачи всех типов. Для этого вам нужно выбрать подходящую коллекцию.
- Методы:
- Получение списка всех задач.
- Получение списка всех эпиков.
- Получение списка всех подзадач определённого эпика.
- Получение задачи любого типа по идентификатору.
- Добавление новой задачи, эпика и подзадачи. Сам объект должен передаваться в качестве параметра.
- Обновление задачи любого типа по идентификатору. Новая версия объекта передаётся в виде параметра.
- Удаление ранее добавленных задач — всех и по идентификатору.
- Управление статусами осуществляется по следующему правилу:
- Менеджер сам не выбирает статус для задачи. Информация о нём приходит менеджеру вместе с информацией о самой задаче.
- Для эпиков:
- если у эпика нет подзадач или все они имеют статус NEW, то статус должен быть NEW.
- если все подзадачи имеют статус DONE, то и эпик считается завершённым — со статусом DONE.
- во всех остальных случаях статус должен быть IN_PROGRESS.