我有一个称为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()
}
}
千巷猫影
波斯汪
相关分类