2

我需要运行一个测试脚本,它有超过 10 个条件来验证。如果任何步骤失败,则程序将失败并且不会执行进一步的步骤。目前,我的程序是这样的:

boolean status = 0;

status = function1(param1, param2);
if (status) {
   status = function2(param1, param2);
   if(status) {
      status = function3(param1, param2);
      if(status) {
         status = function4(param1, param2);
      }
      :
      :
      :
   }
} 

return status;

我对这么多嵌入的 IF 子句不满意。有更好的方法吗?

4

5 回答 5

4

翻译成 Perl,你可能会这样写:

sub testing
{
    my $status;

    if (($status = function1($param1, %param2)) &&
        ($status = function2($param1, %param2)) &&
        ($status = function3($param1, %param2)) &&
        ($status = function4($param1, %param2)))
    {
        # ...do whatever...
    }

    return $status;
}

或者,假设这$status只是一个布尔值:

sub testing
{
    return 0 if !function1($param1, %param2) ||
                !function2($param1, %param2) ||
                !function3($param1, %param2) ||
                !function4($param1, %param2);

    # ...do whatever...

    return 1;
}

或者:

sub testing
{
    return 0 unless function1($param1, %param2);
    return 0 unless function2($param1, %param2);
    return 0 unless function3($param1, %param2);
    return 0 unless function4($param1, %param2);
    # ...do whatever...
    return 1;
}

如果你真的有 10 个具有相同调用签名的函数,那么你甚至可以这样做:

sub testing
{
    my @funcs = ( &function1, &function2, &function3, &function4, &function5,
                  &function6, &function7, &function8, &function9, &function10,
                );

    for my $funcref (@funcs)
    {
        return 0 unless &$funcref($param1, %param2);
    }

    # ...do whatever...

    return 1;
}

请注意,前三个替代方案将处理不同的函数调用签名,只是代码布局更加混乱;最后一个几乎需要列表中每个函数的相同函数调用签名。

于 2013-09-01T08:02:03.797 回答
3
return function1($param1, %param2) &&
       function2($param1, %param2) &&
       function3($param1, %param2) &&
       function4($param1, %param2);

一旦其中一个函数返回错误值,这将使用短路来停止评估。

于 2013-09-01T08:26:53.960 回答
2

记住&&短路,这意味着在下面的语句中

func1 && func2

如果func1评估为假,则func2永远不会评估,因为&&此后永远不会为真。

这意味着您可以在没有任何if子句的情况下复制您的功能:

return func1 && func2 && func3 ...
于 2013-09-01T08:48:06.740 回答
0

避免所有嵌套但与原始选项类似的另一个选项:

boolean status = 0;

status = function1(param1, param2);
if (status) {
    status = function2(param1, param2);
}
if (status) {
    status = function3(param1, param2);
}
if (status) {
    status = function4(param1, param2);
}

这种风格允许轻松添加更多呼叫和轻松重新排序。

于 2013-09-01T09:05:38.233 回答
0

我想再提一个选项:

通过=真

通过=通过 && cond1 通过=通过 && cond2 ...如果(通过)...

于 2013-09-01T08:26:49.590 回答