2013-09-01 3 views
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. Есть ли лучший способ сделать это?

+2

Что случилось со всеми сигилами? –

+0

аналогичная статья IF. – ericyoung

ответ

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; 
} 

Обратите внимание, что первые три альтернативы будут обрабатывать сигнатуры вызова расходящихся функций только с мессианской компоновкой кода; для последнего в значительной степени требуется одна и та же подпись вызова функции для каждой из функций в списке.

+1

Мне не нравятся несколько присваиваний внутри 'if()'. Второй пример в порядке, и, возможно, 'func() или die/return' чаще встречается в perl –

+0

. Учитывая более поздние версии, мне тоже не нравится первый; и укажите, что в вопросе значение является логическим, вы можете избежать назначений и просто проверить возвращаемые значения функции. –

0

я хотел бы отметить еще один вариант:

прошел = истинные

прошло = прошло & & COND1 прошли = прошли & & cond2 ... если (прошло) ...

3
return function1($param1, %param2) && 
     function2($param1, %param2) && 
     function3($param1, %param2) && 
     function4($param1, %param2); 

Для этого используется short-circuit, чтобы прекратить оценку, как только один из функции возвращают ложное значение.

2

Помните, что && короткого замыкания, что означает, что в следующем операторе

func1 && func2 

если func1 оценивается как ложное, то func2 никогда не оценивали, так как && никогда не может быть правдой в дальнейшем.

Это означает, что вы можете реплицировать функциональность без каких-либо if пунктов:

return func1 && func2 && func3 ... 
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); 
} 

Этот стиль позволяет легко добавлять больше звонков и простого переупорядочения.

+0

Он пройдет через все этапы. Технически, не самый эффективный способ. – ericyoung

+0

@ericyoung Вы правы, но с современными компьютерами, волнующими оптимизацию нескольких тестов, вероятно, является отвращение людей. Что гораздо важнее, так это способность понимать и поддерживать программу. Первоначальный вопрос попросил улучшить способы написания кода, и я считаю, что это, в некотором смысле, лучше. – AdrianHHH

+0

@AdiranHHH Вы правы. Он намного чище, чем другие подходы. Хотел бы я выбрать более одного правильного ответа. – ericyoung

Смежные вопросы