От повторяющегося кода Python к функции, модулю и тесту

← Все подборки материалов

Разработка · 4 материала

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

4 материала по задачеПерейти к инструкциям ↓
В этой подборке

Материалы подборки

Выберите инструкцию под свою задачу. Ниже — подробный разбор выбора и проверки результата.

Хорошая проверка границы — попросить другого человека назвать назначение функции по её имени, параметрам и примеру результата. Если для объяснения приходится открывать несколько посторонних участков программы, часть зависимости осталась скрытой. Не обязательно сразу усложнять архитектуру: иногда достаточно передать недостающий параметр явно и сохранить небольшой проверенный пример использования.

Маршрут выделения функции

Шаг Что определить Проверка
Параметры Какие данные нужны действию Их можно передать явно
Результат Что получает вызывающий код Результат можно сравнить с ожидаемым
Модуль Где хранится повторно используемая часть Её можно импортировать
Тест Какое поведение должно сохраняться Примеры проходят после изменения кода

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

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

Какие примеры нужны

Запишите обычный вход, граничный случай и явно недопустимые данные, если функция должна их отвергать. Для каждого примера определите результат до запуска. Тест, который лишь повторяет вычисления реализации, может не заметить ошибку в общем правиле. Лучше использовать небольшой пример, который вы умеете проверить независимо.

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

После переноса в модуль повторите прежние примеры без изменения ожидаемых результатов. Затем вызовите функцию из нового места. Это помогает обнаружить зависимость от случайной переменной исходного файла. Если для импорта требуется сначала выполнить часть другой программы, границу функции и модуля стоит пересмотреть.

Критерии готового выделения

  • Название описывает одно действие.
  • Вход и результат понятны без чтения всей программы.
  • Изменения входных объектов оговорены.
  • Функция доступна через импорт.
  • Контрольные примеры сохраняют ожидаемые результаты.

Начинайте с одного повторяющегося действия, а не с переписывания всего проекта. Когда функция имеет ясную границу и проверку, остальные участки легче сравнивать с ней и переносить по тому же принципу.