-1

我正在应用程序中实现一个干净的架构。我有一个层,其中应用程序/用例类执行业务逻辑并与多个传出端口(用于数据库调用、http api 调用等的适配器的接口)交互。用例将值/模型返回给 Web 控制器(将输出呈现给应用程序的用户)。

由于业务逻辑的复杂性,有许多悲伤的路径和快乐的路径(它们是具有不同状态的不同类型的对象),以及可以冒泡到 Web 控制器的异常。异常由具有通用 http 响应的错误处理程序处理并记录。

为了返回快乐和悲伤的路径,我将它包装在两个字段的对象中。但我觉得这是一种代码味道,因为我总是有一个字段返回 null。因此,在 web 控制器/servlet 中,对填充字段进行检查以确定正确的 http 响应。这是这样做的好方法吗?

我见过用例,返回快乐的路径,所有悲伤的路径都被赋予了特定的业务异常。此异常在 Web 控制器/servlet 中被捕获,并使用异常消息创建 http 响应。我觉得这也是一种代码味道,因为我们在 Web 控制器/servlet 中使用异常作为控制流。

我见过其他返回多个值的方法,例如

  • 使用元组
  • 返回一个对象,但每个字段都是一个列表,因此无需将 null 作为空字段,并使用空列表
  • 使用地图

是否有任何其他方法可以返回多个值,而不使用空字段或使用异常(如上所述)?

4

1 回答 1

0

是否有任何其他方法可以返回多个值,而不使用空字段或使用异常(如上所述)?

Java(和POO语言)中,通常的做法是继承。

您可能迟早会陷入表达式问题,也就是说,您必须小心何时在类层次结构中包含进程,以及何时单独定义该进程

如果您的流程在层次结构中有意义,请在其中定义它:

abstract class Response {
    abstract boolean isSuccess();
    abstract String getMessage();
}

class ErrorResponse extends Response {
    boolean isSucess() { return false; }
    String getMessage() { return "Something went wrong."; }
}

class SuccessResponse extends Response {
    boolean isSucess() { return true; }
    String getMessage() { return "Everything went well."; }
}

但是你不能期望你的层次结构包含任何情况的逻辑,所以你可以使用内省。例如。在某些视图控制器中:

Color getResponseColor(Response rs) {
    if(rs instanceof NetworkErrorResponse || rs instanceof ServerErrorResponse) {
        return Colors.WITHOUT_SERVICE_COLOR;
    }
    return rs.isSuccess() ? Colors.SUCCESS_COLOR: Colors.ERROR_COLOR;
}

如您所见,在类层次结构中包含颜色决策没有多大意义。

最后,由于您要序列化您的消息,您必须确保传输协议支持继承。

于 2019-10-13T09:42:55.217 回答