Программы, которые можно объяснить
От идеи к программе
Вид
Текст20

Начальный · Глава 1 / 18

Значения и ветвления без догадок

После главы: Перевести правило магазина в вычисление с явными входами.

В этой главе

Имя должно объяснять единицу

Программа начинается не с большого файла, а с небольшого вопроса: какую сумму показывает корзина? Назовём цену одного экземпляра price_kopecks, количество quantity, итог total_kopecks. Такие имена длиннее x и y, зато объясняют арифметику читателю и помогают заметить смешение рублей с копейками.

Переменная связывает имя со значением. Строка «2» и целое число 2 различаются: строка удобна для введённого текста, число — для умножения количества. Внешний текст сначала разбирают и проверяют, а только потом используют. Не заставляйте внутреннюю функцию угадывать, имел ли человек в виду два экземпляра или артикул «2».

Правило важнее краткой записи

Договор учебной скидки: при покупке не менее трёх экземпляров цена каждой строки уменьшается на десять процентов. Денежный результат округляем вниз до целой копейки один раз для всей строки. Это вымышленное учебное правило; реальный магазин должен заранее согласовать округление и скидочные условия.

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

Единица и порядок операций как часть договора

Число 12500 само по себе не говорит, означает ли оно рубли, копейки или количество байтов. Название price_kopecks делает предположение заметным, но не проверяет его автоматически. На границе данных полезно документировать единицу и отклонять несовместимый формат. Внутри небольшой программы можно придерживаться одного целочисленного представления и не выполнять преобразование в каждом выражении. Чем меньше мест меняют единицы, тем проще найти расхождение.

Рассмотрим цену 996 и три экземпляра. Сначала произведение даёт 2988 копеек. Затем девяносто процентов от этой суммы дают рациональное значение 2689,2, а целочисленное деление округляет вниз до 2689. Если сначала уменьшить цену одной единицы, получится 896 копеек и сумма 2688. Обе программы технически исполняются; различие определяет договор магазина. Поэтому тест только на цене 1000 недостаточен: на ней ошибочная последовательность может выглядеть правильной.

Ветвление задаёт разбиение входов. Для порога три существуют количества ниже порога, точно на пороге и выше него. Полезно записать эти классы до написания if. Тогда проверка количества два обнаруживает слишком раннюю скидку, трёх — ошибку строгого сравнения, четырёх — случайно специальную обработку единственного значения. Большое случайное количество не заменяет граничные примеры, потому что не различает многие неверные условия.

Нулевое количество может иметь смысл в редакторе корзины как команда удаления, но в строке готового заказа его лучше не считать покупкой. Это разные интерфейсы с разными правилами. Программа не должна угадывать смысл одного числа по соседнему комментарию. Адаптер редактора сначала удаляет строку, затем передаёт в расчёт только допустимые положительные количества. Так один слой отвечает за действие пользователя, другой — за арифметику проверенной модели.

Разобранный пример

Скидка, которую можно пересчитать

Цена 12 500 копеек и количество три дают 37 500 копеек до скидки и 33 750 после неё. Целочисленное деление реализует выбранное округление вниз. Здесь параметры заранее проверены как положительные целые.

python
def line_total(price_kopecks, quantity):
    subtotal = price_kopecks * quantity
    if quantity >= 3:
        return subtotal * 90 // 100
    return subtotal

assert line_total(12500, 2) == 25000
assert line_total(12500, 3) == 33750

Теперь самостоятельно

Практика

Посчитайте итог для цены 999 копеек при количестве 2 и 3. Объясните остаток дробной копейки и укажите границу, которую обязательно проверить.

Результат: Два результата в копейках и формулировка правила округления.

Подсказка
  • Сначала умножьте цену на количество, затем примените процент.
Решение и проверка

Для двух экземпляров: 999 × 2 = 1998 копеек. Для трёх: 2997 × 90 / 100 = 2697,3 копейки; по нашему договору итог равен 2697.

Проверки количества 2 и 3 обязательны: они расположены по разные стороны порога. Если скидка изменится, обновите правило и ожидаемые значения вместе; не подгоняйте тест под случайное поведение функции.

Проверьте себя без текста

Почему единица есть в имени поля?

Она делает смысл вычисления видимым и помогает обнаружить несовместимые величины.

Одинаковы ли строка «2» и число 2?

Нет; одинаковое отображение не означает одинаковый тип и допустимые операции.

Проверить по первоисточникам

Конец образца

Полный том содержит 18 глав, решения, итоговый проект и словарь. Продажи откроются после предметной редактуры и подключения магазина.