избежать множества проверок if-else - PullRequest
2 голосов
/ 13 января 2011

Я работаю над умеренно большим C-файлом, где мне нужно выполнить обработку для 3 различных исключительных условий.(если условие 1 присутствует, сделайте это, если 2 присутствует, сделайте что-нибудь еще и аналогично).Таким образом, во многих местах этого файла мне нужно выполнить проверку if / else, что выглядит грязно.У меня есть около 50 мест, где я делаю эти проверки.

Есть ли лучший способ, чтобы код выглядел чище?

Ответы [ 4 ]

5 голосов
/ 14 января 2011

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

2 голосов
/ 14 января 2011

есть два основных варианта, и они зависят от проблемы, которую решает ваш код

1.) Если ваше условие одинаково во всем файле кода c, то есть условие не изменяется, но код долженведут себя по-разному в нескольких местах.

то есть

/* prepare */
if(cond == 1){ 
  /*prepare 1 */
}elseif(cond == 2){
  /*prepare 2 */
}

/* run */
if(cond == 1){ 
  /*run 1 */
}elseif(cond == 2){
  /* run 2 */
}

, в этом случае вы должны просто рефакторировать вещи, чтобы быть в одном условии.т.е.

/* process and run */
if(cond == 1){ 
  /* process 1 */
  /* run 1 */
}elseif(cond == 2){
  /* process 2 */
  /* run 2 */
}

, если у вас есть изменяющиеся условия во всем коде.то есть

cond = DEFAULT_COND /* = 1 */;
/* prepare */
if(cond == 1){ 
  cond = prepare_1();
}elseif(cond == 2){
  cond = prepare_2();
}

/* run */
if(cond == 1){ 
  /* run 1 */
}elseif(cond == 2){
  /* run 2 */
}

в этом случае ваш код слишком сложен, чтобы его можно было просто рефакторизовать, поскольку переменная cond во время оценки кода «run» могла быть изменена кодом «process», в этом случае, но только в таком случае.Вы не сможете изменить код в единое условие.

1 голос
/ 14 января 2011

Необходимо рассмотреть несколько способов:

  • Оператор switch может помочь сделать ваш код более читабельным, если эти условия ссылаются (или могут быть сделаны ссылками) на одну и ту же переменную.

  • Если контролируемые операторы просты (например, присваивание), вы можете #define макрос для конструкции if ... else if ... else ....

  • Если общие части между делами относительно невелики, было бы лучше определить три разные функции.Это может привести к умеренному дублированию кода.

  • Если общие части больше, переместите их в функции и определите отдельную функцию для каждой части.Если функции "part" становятся слишком сложными, вы можете вместо этого использовать макросы, хотя это увеличивает размер создаваемого объектного кода.Затем создайте отдельную функцию для каждого из трех случаев, используя эти функции или макросы «part».

Последние два варианта уменьшают условные проверки до одного с минимальным кодом или без кода.Дублирование.

PS. Под «общими частями» я подразумеваю те части кода, которые выполняются независимо от того, какой из трех вариантов действительно активен.

1 голос
/ 14 января 2011

Если я правильно понимаю - вы проверяете одни и те же условия снова и снова?

Если это так, я бы проверил эту проверку только один раз, и если для этого требуется дублирование кода - поместите этот код в функции.

...