Общий код для веток лестницы if-else-if - PullRequest
0 голосов
/ 05 апреля 2020

Существует ли стандартный шаблон структурированного программирования для избежания повторения в случаях, подобных следующему (показано в 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, но это не относится к операторам.)

...