Ответ
Идеально описанная задача содержит всю необходимую информацию для её однозначного понимания и выполнения без дополнительных уточнений.
Структура идеального описания:
-
Цель и контекст (ЗАЧЕМ?)
- Четкая бизнес- или пользовательская цель.
- Связь с другими задачами или частью продукта.
-
Детали реализации (ЧТО?)
- Ожидаемое поведение: Описание фичи, включая основные сценарии использования (happy path).
- Edge-кейсы и обработка ошибок: Что должно происходить при отсутствии сети, невалидных данных и т.д.
- Ограничения: Требования к производительности, безопасности, доступности.
-
Технические спецификации (КАК?)
- Стек технологий: Целевая версия iOS, фреймворки, архитектурный паттерн (если важно).
- Дизайн: Ссылка на макет в Figma/Zeplin с указанием размеров, цветов, шрифтов.
- API: Эндпоинты, ожидаемые запросы/ответы, ошибки.
-
Критерии приемки (КОГДА ГОТОВО?)
- Четкий список условий, при которых задача считается выполненной.
- Может включать тест-кейсы для QA.
Пример:
Плохо: "Добавить обновление списка по pull-to-refresh."
Идеально: "Реализовать механизм pull-to-refresh на экране ленты новостей (
FeedViewController).
- Цель: Позволить пользователю вручную обновить контент, если он устарел.
- Поведение: Притягивание списка вниз и отпускание инициирует запрос к
/api/v1/feed. Во время загрузки отображается стандартный индикаторUIRefreshControl. При успехе список обновляется, индикатор скрывается. При ошибке — показывается тост "Не удалось обновить", индикатор также скрывается.- Дизайн: Стандартный системный индикатор. Согласно макету
Figma → Feed → States.- Технически: Использовать
UIRefreshControl. Поддержка iOS 15+.- Критерии: 1) Индикатор появляется при pull. 2) Данные обновляются после успешного ответа API. 3) Обрабатываются ошибки сети."
// Пример реализации критерия
class FeedViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
tableView.refreshControl = refreshControl
}
@objc private func refreshData() { /* Fetch and reload */ }
}