В разработке программного обеспечения во многих случаях мы сохраняем обработчик или дескриптор, чтобы отменить операцию или закрыть ресурс. Возможно, наиболее знакомым примером является сохранение объекта тайм-аута, возвращаемого функцией setTimeout
, для его очистки.
Начнем с примера. Где-то в моем коде я создал ловушку тайм-аута:
Ловушка выдаст исключение через 5 секунд. Позже, если мой процесс прошел успешно, и я хочу отменить ловушку, мне нужно:
- Доступ к объекту
timer
- Реализовать отмену
В то время как первое требование в основном является обязательным, второе требует знаний о создании таймера и, следовательно, связи.
Чтобы устранить эту связь, функция, создающая побочный эффект, должна возвращать обработчик отмены.
Рассмотрим следующую функцию тайм-аута:
Эта реализация создает таймер и функцию отмены в одном контексте. Для отмены тайм-аута, созданного этой функцией, требуется не более чем вызов функции.
Давайте посмотрим на пример «реального мира» для этого таймера:
Другое использование функций отмены — изящное завершение приложений. Мы можем использовать ту же концепцию для любого ресурса, который необходимо «отменить» (закрытие обработчика файлов, закрытие соединения с базой данных и т. д.).