Go: подмена зависимостей интерфейсами и fake-уведомитель
Статусы доставки по нескольким каналам
Когда интернет-магазин отправляет посылку, покупатель ждёт известий сразу по нескольким каналам: в телефонный номер приходит короткое сообщение, а на экран устройства — всплывающее уведомление. Оба канала независимы друг от друга и обслуживаются разными компонентами системы. Сервис доставки не должен знать, как именно устроена та или иная технология отправки, — его задача строго ограничена: принять статус и передать его в каждый из каналов.
Именно эта граница ответственности определяет, как строятся зависимости. Сервис работает с двумя узкими контрактами — отдельно для SMS и отдельно для push-уведомления — и не предполагает, что за ними скрывается один объект или сложная иерархия. Такое разделение позволяет свободно подставлять любую реализацию в каждый канал, не затрагивая остальные части системы.
На практике в одной среде удобно печатать оба сообщения прямо в консоль, чтобы сразу видеть происходящее. В другой среде нужно убедиться, что статус действительно был передан, — для этого реализация хранит отправленные данные внутри себя и позволяет их впоследствии прочитать. Сервис при этом ничего не знает о том, куда именно уходят данные: он лишь вызывает оба канала и, если один из них сообщает об ошибке, немедленно останавливается, не продолжая дальнейшую рассылку.
Что нужно сделать
Допишите FakeNotifier и DeliveryService.SendStatus. Ввод содержит статус без пробелов и режим сбоя: none, sms или push. Fake записывает попытку как sms:STATUS или push:STATUS; при настроенном сбое возвращает sms failed либо push failed. Сервис сначала вызывает SMS, затем push и немедленно возвращает первую ошибку. После сообщений программа печатает error=none или error=ТЕКСТ.
Пример
- Ввод
packed none
- Вывод
sms:packed push:packed error=none
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Go: композиция интерфейсов ReaderNotifier и обработка ошибки
- Go pointer receiver и встраивание struct: изменяемый счётчик
- Go type assertion с ok: дополнительный интерфейс для объекта
- Go fmt.Sprintf: форматирование строки и числа с двумя знаками
- Go if и switch: несколько значений в одной ветке
- Go strings.Split и strconv.ParseFloat: сумма чисел в строке
