我正在处理一个中等大小的C文件,我需要处理3种不同的独有条件。 (如果存在条件1,则执行此操作,如果存在2则执行其他操作,同样)。所以,在该文件的许多地方,我需要做if / else检查 - 看起来很脏。 我有50个地方在做这些检查。
有没有更好的方法,让代码看起来更干净?
答案 0 :(得分:5)
如果条件非常独特,那么我将从三个独立的函数开始,每个函数对应一个函数。将任何公共代码分解为可以从三个过程函数调用的函数。唯一有条件的左边应该是你决定调用三个过程函数中的哪一个的地方。
答案 1 :(得分:2)
有两个主要选项,它们取决于您的代码解决的问题
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变量可能已被“进程”代码更改,在这种情况下,但仅限于类似情况这个。您是否无法将代码重构为单一条件。
答案 2 :(得分:1)
如果我理解正确 - 你一遍又一遍地检查相同的条件?
如果是这样的话,我只会检查一次,如果需要复制代码,请将此代码放入函数中。
答案 3 :(得分:1)
需要考虑几种途径:
如果这些条件引用(或可以引用)同一个变量,switch
语句可能有助于使代码更具可读性。
如果受控语句很简单(例如作业),您可以#define
构建if ... else if ... else ...
构建的宏。
如果案例中的公共部分相对较小,最好定义三种不同的功能。但是,这可能会导致适量的代码重复。
如果公共部件较大,请将它们移动到功能部件并为每个部件定义单独的功能。如果“part”函数变得过于复杂,则可以使用宏代替,但这会增加生成的对象代码的大小。然后使用这些“部分”函数或宏为这三种情况中的每一种创建一个单独的函数。
最后两个途径会将条件检查减少为一个,最少或没有代码重复。
PS:“公共部分”是指执行代码的那些部分,无论三种情况中的哪一种实际上都是活动的。