2013-07-05 6 views
1

На днях я был кодированием, когда внезапно я обнаружил, что борюсь с простой проблемой, но смущаю решение (по крайней мере, на путинском пути).Каков рекомендуемый способ использования шаблона Null в Python?

код должен был просто скачать некоторые файлы, для этого, было бы назвать некоторые DownloadController передавая ей callback так полученные события, такие как init, progress, error и success.

Однако мой код не нуждался во всех этих событиях. С этим пришло на мой взгляд, некоторые решения

  • Изменение DownloadController иметь значение по умолчанию callback=None и проверять его так, чтобы игнорировать отправки события в этом случае
  • Have NullCallbackImpl который прилипает обратный вызов интерфейса, но не делать ничего (просто pass на каждое событие)

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

Итак, я придерживаться второго подхода ... Вопросы:

  • Как хорошо (может быть «как плохо») было бы иметь null_callback = mock.Mock()? (используя библиотеку python mock от Michael Foord)
    • Есть ли библиотека, которая это делает?
  • Или я должен придерживаться создания NullCallbackImpl, реализующего каждый метод с помощью простого pass?
+0

Mocks запись каждый звонок. Вы не хотите, чтобы каждое событие создавало кучу журналов мусора. – user2357112

+0

Это хороший момент. В самом деле, единственный аргумент, который мне нужно, просто избегать этого. Благодаря! –

ответ

1

Вы обнаружили новый вариант использования для DownloadController - «Позвольте пользователю настроить обратный вызов». Похоже, вы контролируете источник Downloadcontroller. Он может определять класс DownloadCallback, который предоставляет события как методы, но ничего не делает с ними. Контроллер будет принимать None (ничего не делать) или что-либо, что реализует интерфейс DownloadController.

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

+0

Первое предложение кажется вполне правильным в этом случае. «Пользователь» мог бы обрабатывать обратный вызов по своему усмотрению (показать прогресс с пользовательским интерфейсом и т. Д.). Я бы придерживался предложенного решения, однако хотел бы найти способ просто поместить «null_object» «который обрабатывает все для меня ... в каждом случае ... который когда-либо интерфейс ... –

Смежные вопросы