2

我正在处理一个中等大小的 C 文件,我需要针对 3 个不同的排他条件进行处理。(如果条件 1 存在,则执行此操作,如果条件 2 存在,则执行其他操作,同样如此)。因此,在该文件的许多地方,我需要进行 if/else 检查——这看起来很脏。我有大约 50 个地方在做这些检查。

有没有更好的方法,让代码看起来更干净?

4

4 回答 4

5

如果条件真的是排他性的,那么我将从三个单独的函数开始,每个进程一个。将任何通用代码分解为它们自己的函数,您可以从三个流程函数中调用它们。剩下的唯一条件应该是您决定调用三个流程函数中的哪一个。

于 2011-01-13T21:02:52.577 回答
2

有两个主要选项,它们取决于您的代码解决的问题

1.)如果您的条件在整个 c 代码文件中都是相同的,这意味着条件不会改变,但代码在几个地方的行为必须不同。

IE

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

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

在这种情况下,您应该将事物重构为单一条件。IE

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

如果您在整个代码中都有变化的条件。IE

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 变量可能已被“进程”代码更改,但仅在这种情况下。您是否无法将代码重构为单个条件。

于 2011-01-13T22:02:28.560 回答
1

如果我理解正确 - 你一遍又一遍地检查相同的条件?

如果是这样,我只会进行一次此检查,如果这需要复制代码 - 将此代码放入函数中。

于 2011-01-13T21:04:04.230 回答
1

几个途径可以考虑:

  • 如果switch这些条件引用(或可以引用)相同的变量,则语句可能有助于使您的代码更具可读性。

  • 如果受控语句很简单(例如赋值),您可能可以#define为该if ... else if ... else ...构造创建一个宏。

  • 如果案例之间的共同部分比较少,最好定义三个不同的函数。不过,这可能会导致适量的代码重复。

  • 如果公共部分较大,则将它们移至函数并为每个部分定义单独的函数。如果“部分”函数变得过于复杂,您可以改用宏,尽管这会增加生成的目标代码的大小。然后使用这些“部分”函数或宏为这三种情况中的每一种创建一个单独的函数。

最后两种途径将条件检查减少到一种,代码重复最少或没有。

PS:“公共部分”是指无论这三种情况中的哪一种实际处于活动状态,都执行的代码部分。

于 2011-01-13T21:07:45.940 回答