不太确定这种模式/问题的正式术语是什么,但这是我面临的问题:
我有一个有点大的手术。它可以通过或失败。每次通过或失败都带有成功操作的结果或有关操作失败原因的信息。我正在努力“正确”构建此功能。
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))
)
这些方法似乎都不完美。我觉得应该有一种模式来解决这种问题。有吗?
最佳答案
在这种情况下,抛出错误的方法似乎是最好的。
原因
您可以为多种类型创建多个自定义异常,并在出现任何错误时创建。通过这种方法,您可以确保无论何时发生错误,您的程序都会返回带有指定错误的控件。
作为返回类型,您可以返回具有特定值的结果。因此,每当您的程序返回某些内容时,它似乎可以正常工作或通过。
关于java - 是否存在通过/失败设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50067013/