Shanraq.org Shanraq.org
Функция как обещание: вход, результат и условия
Общество

Информатика: создаём своего цифрового помощника Урок 24 из 26

Функция как обещание: вход, результат и условия

Выделим проверку срока в отдельную функцию с ясным входом, выходом и поведением при ошибке.

Где мы на карте

Это третий блок одного проекта. Мы пользуемся данными версии 0.2, но пока описываем действия на бумаге: так можно обнаружить ошибку до написания Python.

Функция как обещание: вход, результат и условия

Ситуация и вопрос

Один и тот же вопрос «пора ли напомнить?» понадобился в списке задач и в карточке задачи. Если скопировать правило дважды, через месяц исправят только одну копию. Нужна одна функция и письменный договор о её поведении.

Новые слова без пропусков

Функция — названная часть алгоритма, которая получает вход и возвращает результат. Параметр — имя входа внутри описания; аргумент — конкретное переданное значение. Возвращаемое значение — ответ функции, не обязательно сообщение на экране. Предусловие описывает, какие входы допустимы. Постусловие описывает гарантированный результат для допустимого входа. Контракт объединяет эти правила и поведение при ошибке. Функция не обязана быть без побочных эффектов, но для простой проверки срока мы явно запрещаем менять файл.

Опорный сигнал

вход + предусловие → одна функция → результат + гарантия

Разбираем шаг за шагом

Опишите should_remind(done, days_to_due). Вход: логическое done и целое число дней либо отсутствие срока. Выход: одно из REMIND, NOT_YET, OVERDUE, NO_DATE, DONE. Порядок: если done=true, вернуть DONE; иначе если срока нет, NO_DATE; иначе если дней меньше 0, OVERDUE; иначе если не более 2, REMIND; иначе NOT_YET. Для (false,2) ответ REMIND, для (false,3) — NOT_YET, для (true,2) — DONE. Файл при вызове не изменяется. Это важная гарантия: экран может спрашивать функцию сколько угодно раз.

Проверка руками

Пусть одноклассник играет роль функции: вы передаёте карточки done и days_to_due, он возвращает ровно одну карточку ответа. Начните с done=true, days_to_due отсутствует: ответ DONE, потому что завершённость проверяется раньше срока. Затем передайте done=false, days_to_due отсутствует: теперь NO_DATE. Нарисуйте стрелку возврата для каждого случая. Если партнёр пытается вернуть два ответа или молчит, уточните договор функции. Функция не должна изменять исходную задачу ради ответа.

Предскажите и проверьте

Каков ответ (false,-1)? OVERDUE; (false,None)? NO_DATE; (true,None)? По выбранному порядку DONE. Если ученик предпочитает сообщать NO_DATE даже для завершённой задачи, это другой допустимый контракт, но его нужно записать и одинаково применять везде.

Поймайте ошибку

«Функция получает days_to_due, поэтому может молча считать отсутствующий срок нулём». Ноль означает сегодня, а отсутствие означает неизвестно. Смешение даёт ложные напоминания. Исправьте тип входа или добавьте отдельную ветку.

Перенос в новую ситуацию

Опишите функцию count_done(tasks) с входом «список задач» и выходом «целое число». Её предусловие требует, чтобы у каждой записи done было логическим значением. Постусловие: результат между 0 и длиной списка; сам список не меняется.

Изменение проекта

В ALGORITHM-ru.md добавьте контракт should_remind: таблицу входов, пять возможных выходов, правило отсутствующего срока и гарантию «не меняет файл». Свяжите его с ветвлением урока 22 и тремя проверками границы.

Задание и доказательство

Дайте другому ученику только контракт. Он должен предсказать пять результатов, не глядя на вашу схему. Затем поменяйте порядок двух проверок и найдите вход, на котором ответ меняется. Доказательство — контракт и контрпример.

Возврат через 1, 7 и 30 дней

Завтра различите параметр и аргумент. Через семь дней напишите контракт для другой задачи. Через месяц сверяйте поведение Python-функции с обещанными случаями.

Следующий урок: Правильный и достаточно быстрый алгоритм

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить доказательство проекта

Запишите наблюдение, объяснение, исправление ошибки и изменение своего проекта. Модель укажет первую перепутанную или недоказанную связь, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.