Строим проект по шагам
Маленькими проверяемыми шагами вместо 80 строк за раз — и системный способ найти и исправить ошибку, когда что-то пошло не так.
Не пишите 80 строк, а потом нажимайте «Запустить»
Профессиональная привычка, которую стоит выработать с первого крупного проекта: инкрементальная разработка — маленькими шагами, каждый из которых сразу проверяется.
Версии: сначала работает, потом — лучше
| Версия | Что в ней есть |
|---|---|
| V1 | минимальная работающая версия — ядро идеи, без украшений |
| V2 | более надёжная проверка ввода, обработка граничных случаев |
| V3 | дополнительные возможности, улучшенный вывод |
Такую первую работающую версию иногда называют MVP (minimal working version) — «сначала добьёмся маленькой, но работающей версии», а уже потом улучшаем.
Проверяем проект на примерах
Для каждого нетривиального проекта полезно заранее продумать несколько сценариев — что подать на вход и что должно получиться на выходе:
| Сценарий | Вход | Ожидаемый результат |
|---|---|---|
| секрет 50, попытка меньше | guess = 20 | «слишком мало» |
| секрет 50, попытка больше | guess = 70 | «слишком много» |
| секрет 50, попытка верна | guess = 50 | победа, цикл завершается |
Воркфлоу отладки
Пошагово:
print()-отладка
for word in words:
print("DEBUG:", word, counts.get(word)) # временная диагностика
counts[word] = counts.get(word, 0) + 1
print("DEBUG:", ...) внутри цикла — самый надёжный способ увидеть, что происходит на самом деле. Уберите такие строки, когда баг найден и исправлен — иначе они засоряют настоящий вывод программы.Debug Lab: найдите ошибку
В программе ниже счёт должен расти на каждом правильном ответе, но почему-то всегда
остаётся 1. Прежде чем читать дальше — попробуйте найти причину
сами.
answers = ["python", "git", "sql"]
user_answers = ["python", "python", "sql"]
for correct, given in zip(answers, user_answers):
score = 0
if given == correct:
score += 1
print("Итоговый счёт:", score)
score = 0 стоит ВНУТРИ тела цикла — значит, он пересоздаётся на каждой итерации, и предыдущий прогресс теряется. Счётчик нужно инициализировать ОДИН раз, до цикла — та же ошибка, что и «почему cart total сбрасывается на каждой итерации» из главы 10.Чек-лист готовности проекта
Прежде чем сказать «проект готов»
- Программа выполняет то, что требовалось (чек-лист приёмки)?
- Обычный, «счастливый» ввод работает правильно?
- Проверены граничные случаи (пусто, ноль, повтор, неизвестная команда)?
- Имена переменных понятны без дополнительных объяснений?
- Нет ли повторяющегося куска кода, который можно было бы убрать?
- Использована ли подходящая коллекция (список / множество / словарь)?
- Цикл действительно останавливается в нужный момент?
- Условия проверяют именно то, что нужно?
- Вывод понятен — пользователь видит, что произошло?
- Сможет ли другой человек прочитать и понять эту программу?