Задача курса
Go: подмена зависимостей интерфейсами и fake-уведомитель
Курс «Golang с нуля» · урок «Композиция интерфейсов и подмена зависимости»
Условие
Статусы доставки по нескольким каналам
Когда интернет-магазин отправляет посылку, покупатель ждёт известий сразу по нескольким каналам: в телефонный номер приходит короткое сообщение, а на экран устройства — всплывающее уведомление. Оба канала независимы друг от друга и обслуживаются разными компонентами системы. Сервис доставки не должен знать, как именно устроена та или иная технология отправки, — его задача строго ограничена: принять статус и передать его в каждый из каналов.
Именно эта граница ответственности определяет, как строятся зависимости. Сервис работает с двумя узкими контрактами — отдельно для SMS и отдельно для push-уведомления — и не предполагает, что за ними скрывается один объект или сложная иерархия. Такое разделение позволяет свободно подставлять любую реализацию в каждый канал, не затрагивая остальные части системы.
На практике в одной среде удобно печатать оба сообщения прямо в консоль, чтобы сразу видеть происходящее. В другой среде нужно убедиться, что статус действительно был передан, — для этого реализация хранит отправленные данные внутри себя и позволяет их впоследствии прочитать. Сервис при этом ничего не знает о том, куда именно уходят данные: он лишь вызывает оба канала и, если один из них сообщает об ошибке, немедленно останавливается, не продолжая дальнейшую рассылку.
Что нужно сделать
Допишите FakeNotifier и DeliveryService.SendStatus. Ввод содержит статус без пробелов и режим сбоя: none, sms или push. Fake записывает попытку как sms:STATUS или push:STATUS; при настроенном сбое возвращает sms failed либо push failed. Сервис сначала вызывает SMS, затем push и немедленно возвращает первую ошибку. После сообщений программа печатает error=none или error=ТЕКСТ.
Примеры
Пример 1
- Ввод
packed none
- Ожидаемый результат
sms:packed push:packed error=none
