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



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

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

class Pass{
int someGoodStuff;
double someOtherGoodStuff;
}
class Fail{
String failureMsg;
float howMuchOperationWasOffBy;
}
class Operator{
public ??? operation(){
}
}

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

方法 2:java 中的函数喜欢返回一个对象类型,因此让 Pass 和 Fail 都实现一个接口 Result,并且函数的返回类型就是这样。

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

但是,通过和失败表示函数返回是完全不同的。它们几乎没有重叠的变量或函数。这似乎是错误的,并减少了我不得不从通过和失败中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());
}

这基本上是我用实例所做的,但看起来更好;代码现在看起来就像你期望的那样。遵循是显而易见的。

但是,Java没有真正的联合类型。我必须确保有人不会意外地试图弄乱失败结果的传递变量,反之亦然。此外,我对联合类型的每一种方法都必须以弄清楚它是通过还是失败为前提(如果分支突然必须无处不在)

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

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

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

原因

  1. 您可以为多种类型创建多个自定义例外,并在发生任何错误时创建。通过这种方法,您可以确保每当发生不良情况时,程序都会返回具有指定错误的控件。

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

最新更新