java - 是否存在通过/失败设计模式?

标签 java design-patterns

不太确定这种模式/问题的正式术语是什么,但这是我面临的问题:

我有一个有点大的手术。它可以通过或失败。每次通过或失败都带有成功操作的结果或有关操作失败原因的信息。我正在努力“正确”构建此功能。

class Pass{
    int someGoodStuff;
    double someOtherGoodStuff;
}

class Fail{
    String failureMsg;
    float howMuchOperationWasOffBy;
}

class Operator{
    public ??? operation(){
    }
}

方法 1:失败状态类似于异常。让我们扔掉它们。这允许我包含失败信息并使返回类型只是 Pass。但是,这些失败状态不是编程语言错误,而是业务逻辑失败。因此,我认为这种方法有两点不对:第一,它将业务逻辑失败与实际的 Java 错误混淆(这似乎是错误的);第二,它在没有任何真正充分理由的情况下采用正常的执行流程。

方法2:java中的函数喜欢返回一种对象类型,所以Pass和Fail都实现了一个接口(interface)Result,函数的返回类型就是那个。

interface Result{...}
class Pass implements Result{...}
class Fail implements Result{...}
class Operator{
    public Result operation(){...}
}

但是函数返回的 pass 和 fail 状态是完全不同的。它们几乎没有重叠的变量或函数。这似乎是错误的,并且减少了我必须 instanceof 从通过和失败中获取所有重要信息。

方法 3:某种可以通过或失败(但不能同时通过)的联合对象

class Result{
    public Pass pass=null;
    public Fail fail=null;
}

class Operator{
    public Result operation(){...}
}

这样做的好处是我可以这样说

Result result=op.operation();
if (result.succeed()){
    doStuffWithPass(result.getPass());
}else{
    doStuffWithFail(result.getFail());
}

这基本上就是我用 instanceof 做的,但更漂亮;代码现在看起来就像您期望的那样。很清楚地遵循。

但是,Java 没有真正的联合类型。我必须确保不会有人不小心弄乱了失败结果的传递变量,反之亦然。此外,我在联合类型上调用的每个方法都必须断定它是通过还是失败(如果分支突然必须无处不在)

最后,虽然还不是真正关心的问题,但我相信这种模式会为每个结果的通过和失败分配空间,当我知道它只能是其中之一时(即它应该占用空间等于 Max(space(Pass),space(Fail)))

这些方法似乎都不完美。我觉得应该有一种模式来解决这种问题。有吗?

最佳答案

在这种情况下,抛出错误的方法似乎是最好的。

原因

  1. 您可以为多种类型创建多个自定义异常,并在出现任何错误时创建。通过这种方法,您可以确保无论何时发生错误,您的程序都会返回带有指定错误的控件。

  2. 作为返回类型,您可以返回具有特定值的结果。因此,每当您的程序返回某些内容时,它似乎可以正常工作或通过。

关于java - 是否存在通过/失败设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50067013/

相关文章:

c++ - 如何从装饰元素上移除一层?

c++ - Virtual Constructor 成语 - 良性或完全谬误

design-patterns - 微服务中需要事务发件箱模式

java - 使 JPanel 手动调整大小

java - 在区域设置中设置语言

java:查找程序名称,解析整数参数

java - 调用 getActivity().startActivity(); 之间的区别和startActivity();内部 fragment

java - 将 XML 序列化转换回 Java 代码

c# - 关于工厂设计架构的问题

java - 使用 DAO 模式