- Введение
- Функциональные Требования
- Дизайн
- Алгоритм Интервального Повторения
- Базовые Сущности и Отношения
- Технические требования
- План Разработки
Цель данной технической спецификации — подробно описать функциональные и технические требования для разработки мобильного приложения ComfyMemo. Этот документ служит основой для разработки, тестирования и дальнейшего расширения функционала приложения.
ComfyMemo — мобильное приложение, предназначенное для эффективного запоминания информации с использованием метода интервального повторения, основанного на кривой забывания Эббингауза. Приложение помогает пользователям сохранять знания на длительный срок с минимальными усилиями.
ID | Название | Описание |
---|---|---|
FNR-01 | Внесение информации для повторения | Возможность добавлять информацию, состоящую из вопроса и ответа, для последующего повторения. |
FNR-02 | Выбор способа проверки ответа на вопрос | Возможность выбирать различные способы проверки ответа на вопрос: устный ответ или письменный ввод. |
FNR-03 | Редактирование внесенной информации | Возможность удалять или обновлять информацию для повторения и связанные с ней параметры. |
FNR-04 | Интервальное повторение | Автоматическое планирование следующего повторения информации на основе алгоритма интервального повторения. |
FNR-05 | Организация информации для повторения | Размещение информации, требующей повторения, отдельно от остальной информации для улучшения наглядности. |
FNR-06 | Уведомления о необходимости начать повторение | Отправка уведомлений пользователю о необходимости начать повторение каждой внесенной информации в соответствии с установленным интервалом. |
FNR-07 | Оценка повторения | Оценка запомненной информации (оценка ответа на вопрос) для корректировки интервалов повторений. |
FNR-08 | Локальное сохранение внесенной информации и интервалов повторений | Сохранение в памяти устройства данных об внесенной информации и об интервале повторений для каждой их этой информации |
Note
Описанные ниже use-cases не являются актуальными и показали свою несостоятельность при создании прототипа (wireframe). Они не будут переработаны и оставлены для истории.
Название | Внесение информации для повторения |
---|---|
Цель | Добавить информацию для повторения |
Актор | Пользователь |
Предусловия | Пользователь находится на главном экране |
Основной поток | 1. Пользователь нажимает Floating Action Button "+". 2. Система открывает Full Screen Dialog. 3. Пользователь заполняет поля "Вопрос" и "Ответ". 4. Пользователь выбирает способ проверки ответа на вопрос. 5. Пользователь нажимает Text Button "Save". 6. Система сохраняет информацию. 7. Система закрывает диалоговое окно. |
Альтернативный поток | A1. Пользователь закрывает диалог - Пользователь закрывает диалог с помощью Icon Button или Hardware back. - Система показывает Basic Dialog. - Пользователь выбирает опцию "Discard". - Система не сохраняет информацию. - Система закрывает оба диалоговых окна. A1.1. Пользователь отменяет закрытие диалога. - Пользователь выбирает опцию "Cancel" в Basic Dialog. - Система закрывает только Basic Dialog. A2. Пользователь некорректно заполнил поля A2.1. Пользователь некорректно заполнил поле "Вопрос" - Поле "Вопрос" не содержит значащих символов. - Система визуально сигнализирует об ошибке и отображает сообщение ошибки под полем ввода. A2.2. Пользователь некорректно заполнил поле "Ответ" - Поле "Ответ" не содержит значащих символов. - Система визуально сигнализирует об ошибке и отображает сообщение ошибки под полем ввода. |
Постусловия | 1. Система обновляет список внесенной информации. 2. Система сохраняет внесенную информацию на устройстве. 3. Система планирует повторение только что внесенной информации. |
Связанные требования | FNR-01 FNR-02 FNR-04 FNR-08 |
Название | Просмотр информации необходимой для повторения |
---|---|
Цель | Увидеть информацию необходимую для повторения |
Актор | Пользователь |
Предусловия | Пользователь находится на главном экране |
Основной поток | 1. Пользователь выбирает вкладку "Повторение" в Tab. 2. Система выдает список Card, необходимых для повторения согласно интервалу повторений. |
Альтернативный поток | A1. Пользователь выбирает вкладку "Все карточки" в Tab - Система выдает список всех Card, независимо от необходимости их повторения. A2. Информации не предоставлено - Система вместо списка Card отображает сообщение о том, что информации нет. |
Постусловия | Система корректно отображает соответствующие Card для каждой вкладки в Tab |
Связанные требования | FNR-05 FNR-04 |
Название | Повторение информации |
---|---|
Цель | Повторить информацию которая нуждается в этом |
Актор | Пользователь |
Предусловия | 1. Пользователь находится на главном экране во вкладке "Повторение". 2. Пользователь перешел по уведомлению о необходимости повторения. |
Основной поток | 1. Пользователь нажимает на Card. 2. Система открывает экран повторения. 3. Система отображает увеличенную версию Card c вопросом. 4. Если способ проверки ответа был установлен как письменный ввод — пользователь вводит ответ в карточку. 5. Пользователь нажимает на карточку. 6. Система показывает другую сторону карточки с правильным ответом и, если способ проверки был установлен как письменный ввод — отображает введенный пользователем ответ. 7. Система отображает Slider для оценки повторения. 8. Пользователь устанавливает на Slider необходимое значение. 9. Пользователь нажимает на Common Button "Finish" для завершения повторения. 10. В зависимости от оценки пользователя система корректирует интервал повторения. |
Альтернативный поток | A1. Пользователь перешел по уведомлению - Система сразу открывает экран повторения для необходимой информации A2. Пользователь некорректно заполнил поле "Вопрос" - Поле "Вопрос" не содержит значащих символов. - Система визуально сигнализирует об ошибке и отображает сообщение ошибки под полем ввода. A3. Пользователь выходит с экрана повторения - Пользователь закрывает экран с помощью Icon Button или Hardware back. - Система не изменяет интервал повторения и не считает информацию повторенной. |
Постусловия | 1. Система корректно изменила интервал повторений для данной информации. 2. Система убрала данную информацию из раздела для повторений. |
Связанные требования | FNR-04 FNR-05 FNR-06 FNR-07 |
Название | Уведомление о необходимости повторения |
---|---|
Цель | Отправить пользователю уведомление о необходимости повторения конкретной информации |
Актор | Система |
Предусловия | Некоторая информация стала нуждаться в повторении по истечении установленного интервала повторений для нее |
Основной поток | Система отправляет уведомление пользователю. |
Альтернативный поток | — |
Постусловия | Пользователь получил уведомление |
Связанные требования | FNR-04 FNR-06 |
Название | Редактирование внесенной информации |
---|---|
Цель | Редактировать (обновить/удалить) внесенную информацию и связанные с ней параметры (способ ответа) |
Актор | Пользователь |
Предусловия | Пользователь находится на главном экране во вкладке "Все карточки" |
Основной поток | 1. Пользователь нажимает на Card. 2. Система открывает Full Screen Dialog. 3. Пользователь вносит изменения в необходимые поля. 4. Пользователь нажимает на Common Button "Save". 5. Система сохраняет изменения. |
Альтернативный поток | A1. Пользователь отменяет редактирование - Пользователь закрывает диалоговое окно с помощью Text Button или Hardware back. - Система закрывает диалоговое окно без сохранения изменений. A2. Пользователь удаляет карточку - Пользователь нажимает на Common Buttons "Delete". - Система запрашивает подтверждение удаления при помощи Basic Dialog. - Пользователь подтверждает удаление. - Система удаляет карточку, переходит на главный экран и отображает SnackBar с сообщением об успешном удалении. А2.1. Пользователь отменяет удаление. - Пользователь отменяет удаление в Basic Dialog. - Система закрывает Basic Dialog. A3. Пользователь некорректно заполнил поле "Вопрос" - Поле "Вопрос" не содержит значащих символов. - Система визуально сигнализирует об ошибке и отображает сообщение ошибки под полем ввода. A4. Пользователь некорректно заполнил поле "Ответ" - Поле "Ответ" не содержит значащих символов. - Система визуально сигнализирует об ошибке и отображает сообщение ошибки под полем ввода. |
Постусловия | 1. Данные информации изменены и система отображает обновленные данные 2. Система сохранила в памяти устройства обновленные данные. |
Связанные требования | FNR-03 FNR-08 |
Дизайн приложения разработан в соответствии с Material Design 3, используя цвета, типографику и другие элементы из этого стиля. Дизайн стремится максимально следовать описанным гайдлайнам.
Прототип (Wireframe) и основной дизайн приложения доступны в Figma на разных страницах одного файла: Wireframe и Design в Figma
Алгоритм интервального повторения, используемый в ComfyMemo — FSRS (Free Spaced Repetition Scheduler). Он основан на принципах кривой забывания Эббингауза и адаптируется под индивидуальные результаты пользователя. Цель алгоритма — оптимизировать интервалы между повторениями для максимальной эффективности запоминания информации.
Архитектура созданных сущностей позволяет интегрировать другие алгоритмы интервального повторения, такие как SM-2, без изменения базовой структуры. Это достигается за счёт расширения сущностей ReviewLog и SchedulerEntry для поддержки специфики каждого алгоритма.
Атрибут | Тип данных | Описание |
---|---|---|
id | UUID | Уникальный идентификатор карточки |
title | String | Название карточки |
term | String | Термин/Вопрос |
definition | String | Определение/Ответ |
self_verify | Enum | Тип проверки ответа (самопроверка) (None, Written). |
Атрибут | Тип данных | Описание |
---|---|---|
id | UUID | Уникальный идентификатор записи |
card_id | UUID | Идентификатор связанной карточки |
review | Datetime | Дата и время проведения повторения |
rating | Enum | Оценка пользователя (Forgot, Hard, Good, Perfect) |
Атрибут | Тип данных | Описание |
---|---|---|
id | UUID | Уникальный идентификатор записи |
review_log_id | UUID | Идентификатор связанной записи в ReviewLog |
state | Enum | Состояние карточки после повторения (New, Learning, Review, Relearning) |
Атрибут | Тип данных | Описание |
---|---|---|
id | UUID | Уникальный идентификатор записи планировщика |
card_id | UUID | Идентификатор связанной карточки |
due | Datetime | Дата и время следующего повторения |
scheduled_days | Integer | Количество дней до следующего повторения |
elapsed_days | Integer | Количество дней с момента последнего повторения |
reps | Integer | Количество повторений |
lapses | Integer | Количество пропусков |
last_review | Datetime | Дата и время последнего повторения |
Атрибут | Тип данных | Описание |
---|---|---|
id | UUID | Уникальный идентификатор записи |
scheduler_id | UUID | Идентификатор связанной записи планировщика |
stability | Float | Коэффициент стабильности |
difficulty | Float | Коэффициент сложности |
state | Enum | Текущее состояние карточки (New, Learning, Review, Relearning) |
Flashcard (1) ─── (M) ReviewLog (1) ─── (1) FSRSReviewLog
|
╰─── (M) SchedulerEntry (1) ─── (1) FSRSSchedulerEntry
Dart и Flutter: Основные технологии для разработки бизнес-логики и пользовательских интерфейсов.
- Хранение данных: В первых версиях приложения будет использоваться JSON и файловое хранение данных, но по мере развития будут интегрированы базы данных.
- Внешние Библиотеки: Использование специализированных библиотек ограничено необходимостью работы с аппаратной частью ОС (например, камера, файловое хранилище) и специализированными задачами (например, тестирование).
- Минимальное Использование Внешних Решений: Проект стремится максимально использовать встроенные средства SDK, избегая внешних решений для лучшего понимания встроенных возможностей выбранного стэка и контроля над функционалом.
- Модульность: Архитектура будет разработана таким образом, чтобы компоненты системы можно было легко заменять или обновлять без нарушения общей структуры. Например переход от хранения данных в JSON к использованию базы данных должен осуществляться бесшовно, благодаря принципу модульности и полиморфному поведению компонентов.
GitHub Projects: Используется для управления задачами и отслеживания прогресса разработки.
Все задачи оформляются как issue в репозитории и для каждой задачи будет создаваться отдельная ветка (branch), которая после завершения будет сливаться в main
.