首页 > 解决方案 > 执行函数时避免连续的“if (...)”检查

问题描述

我有一个如下所示的函数:

public Status execute() {
    
    Status status = doSomething();

    if (status != Status.ABORTED) {
        status = doSomethingElse();
    }

    if (status != Status.ABORTED) {
        status = doAgainSomethingElse(param1, param2);
    }

    if (status != Status.ABORTED) {
        doSomethingWhichDoesntReturn(param3);
    }

    //etc.
    
    return status;
}

所以基本上这个函数需要返回一个Status. 这是由第一个函数计算的,然后在执行这些函数时由连续函数重新计算status != Status.ABORTED

我想重构这段代码,但我没有任何有效的想法。

如果它总是status = someFunction(someParam),我会使用一个列表Function<TypeInput, Status>并在循环中执行该列表:

List<Function<TypeInput, Status>> actions = List.of(function1, function2...);
for (Function<TypeInput, Status> f : actions) {
    if (status != Status.ABORTED) {
        status = f.apply(input);
    }
}

但问题是每个动作可能不同(有时它是一个返回的函数Status,有时有参数但并不总是相同的大小,有时它只是一个 void 函数等)

有谁有想法吗?

注意:只要get ,我statusStatus.ABORTED可以返回(我不需要执行函数的其余部分,因为只有在statusis not时才会执行任何操作Status.ABORTED)。

标签: javadesign-patterns

解决方案


这看起来像是 try-catch 方法的一个很好的案例。您可以在任何一种方法中抛出异常,例如StatusAbortedException并捕获它以返回适当的状态。它可能看起来像这样

try {
 Status status = doSomethingElse();
 status = doAgainSomethingElse(param1, param2);
 status = doSomethingWhichDoesntReturn(param3); // this one probably does smth else
 return status;
} catch (StatusAbortedException e){
  // return Status.Aborted 
}

推荐阅读