Задача курса

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

Попробуйте решить

РешениеGo
Без регистрации · результат не сохраняется