Если вы подписаны на «Чистая архитектура» или «Гексагональная архитектура» runRequest
, то вы должны вернуть что-то из вашего домена.Т.е. что вы на самом деле запрашиваете?(как называется ресурс? Страница? Автомобиль? Учетная запись?)
Я бы сказал, что приведенный вами пример обратен чистой архитектуре.Он показывает протоколы и технологии и задает вопрос, что является оптимальным, когда Чистая архитектура предполагает, что транспортные протоколы являются деталями реализации.Сосредоточение внимания на вашем домене (т. Е. На том, что вы выбираете, и на тех операциях, которые вы разрешаете выполнять на них), поможет отделить их от ваших протоколов реализации или транспорта.
Например, представьте, что ваш запрос относится к пользователю и связан с ним.Аккаунт и Страницы, принадлежащие этому пользователю.Сосредоточив внимание на их отношениях
, то есть User.Accounts () или Account.Pages () - это хороший трюк для создания более несвязанного программного обеспечения.Что, если вы предлагаете соединение GRPC?Что если вы хотите поддерживать несколько типов возврата?JSON, XML, Protobuf?
Чистая архитектура решает эту проблему, фокусируясь на объектах домена в первом цикле, а затем на кодировке во внешнем круге.Это означает, что внутренний круг ничего не знает о кодировках (т.е. кодировки зависят от ваших доменных объектов, но ваши доменные объекты не зависят от кодировок)
Если ваша функция выше запрашивает учетную запись
type Account struct {
Name string
ID string
Location string
}
Тогда будет еще один слой, который знает, как кодировать учетную запись:
type JSONAccount struct {
Account
}
func (ja JSONAccount) Encode() ([]byte, error) {
return json.Marshal(ja)
}
Ваша функция runRequest
может работать на интерфейсе
type Encoder interface {
Encode() ([]byte, error)
}
Теперь вы можете поддерживать несколько разных кодировок для возвращаемых типов и выставлять их в качестве флага для вызывающей стороны.Поскольку ваша функция зависит от интерфейса, она сможет работать или возвращать несколько различных кодеров данных, если они соответствуют интерфейсу !!