Существует ли стандартный шаблон структурированного программирования для избежания повторения в случаях, подобных следующему (показано в C)?
if(/* … */) process(foo,bar,baz,0);
else if(/* … */) process(foo,bar,baz,2);
else if(/* … */) process(foo,bar,baz,5);
/* else don’t process() */
Сохранение переменного значения в переменной и последующий вызов является очевидным подход, но требует пропустить вызов в последнем случае, что может быть выполнено несколькими неуклюжими способами:
Дополнительная переменная флага
int arg;
bool go=true;
if(/* … */) arg=0;
else if(/* … */) arg=2;
else if(/* … */) arg=5;
else go=false;
if(go) process(foo,bar,baz,arg);
Недопустимое значение (если оно существует)
int arg=-1;
if(/* … */) arg=0;
else if(/* … */) arg=2;
else if(/* … */) arg=5;
if(arg>=0) process(foo,bar,baz,arg);
Бессмысленно l oop
do {
int arg;
if(/* … */) arg=0;
else if(/* … */) arg=2;
else if(/* … */) arg=5;
else break;
if(go) process(foo,bar,baz,arg);
} while(false);
Избыточный тест
int arg;
if(/* … */) arg=0;
else if(/* … */) arg=2;
else if(/* … */) arg=5;
if(/* … */ || /* … */ || /* … */)
process(foo,bar,baz,arg);
Невыразимое зло
int arg;
if(/* … */) arg=0;
else if(/* … */) arg=2;
else if(/* … */) arg=5;
else goto skip;
process(foo,bar,baz,arg);
skip:;
Есть ли лучше, широко применимый вариант? Вспоминаются петли else
на Python, но не очень хорошо можно надеть if
! (Python также обращается к этому конкретному случаю с functools.partial
, но это не относится к операторам.)