У меня есть тип сервиса с именем ComputeService
, который реализует определенную доменную логику.Сам сервис зависит от реализации интерфейса Computer
, который имеет метод Computer.Compute(args...) (value, error)
.Как показано, Compute
само может возвращать определенные ошибки.
ComputeService
необходимо отправить соответствующие ошибки из набора ошибок домена с соответствующим кодом ошибки домена, чтобы можно было выполнять переводы, а также клиенты могли надлежащим образом обрабатывать ошибки.
Мой вопрос заключается в том, должны ли реализации Computer
обернуть свои ошибки в ошибки домена или ComputeService
должна это сделать.Если это делает ComputeService
, то он должен знать о различных ошибках, возвращаемых различными реализациями интерфейса Computer
, что, на мой взгляд, нарушает абстракцию.Оба способа продемонстрированы ниже:
package arithmetic
type Computer struct {
}
func (ac Computer) Compute(args ....) (value, error) {
// errors is a domain-errors package defined in compute service project
return errors.NewDivideByZero()
}
ИЛИ
package compute
type Service struct {
}
func (svc Service) Process(args...) error {
computer := findComputerImplementation(args...)
val, err := computer.Compute(args...)
if err != nil {
if err == arith.ErrDivideByZero {
// converting an arithmetic computer implementation
// specific error to domain error
return errors.NewDivideByZero()
} else if err == algebra.ErrInvalidCoEfficient {
// converting an algebraic computer implementation
// specific error to domain error
return errors.NewBadInput()
}
// some new implementation was used and we have no idea
// what errors it could be returning. so we have to send
// a internal server error equivalent here
return errors.NewInternalError()
}
}