2011-01-13 99 views
2

我正在研究一箇中等大小的C文件,我需要爲3個不同的排他條件進行處理。 (如果條件1存在,則執行此操作,如果存在2則執行其他操作並且同樣)。所以,在該文件的許多地方,我需要做/如果/其他檢查 - 看起來很髒。 我有50個地方正在做這些檢查。避免很多if-else檢查

有沒有更好的方法讓代碼看起來更清潔?

+5

你能舉一個你的代碼目前的樣子嗎? – 2011-01-13 20:59:48

+0

看起來你需要上課,但就C而言,不可能達到目標? – dzendras 2011-01-13 21:02:24

回答

5

如果條件真的獨享,那麼我會從三個獨立的功能開始,每個過程一個。將任何通用代碼分解成它們自己的函數,您可以從三個過程函數中調用它們。唯一有條件的左邊應該是你決定調用哪三個過程函數的地方。

1

如果我理解正確 - 你一遍又一遍地檢查相同的條件?

如果是這樣,我只會檢查一次,如果這需要重複代碼 - 將此代碼放入函數中。

1

幾種途徑來考慮:

  • 一個switch聲明可能有助於使你的代碼更易讀,如果這些條件是指(或可製成指)相同的變量。

  • 如果受控語句很簡單(例如,分配),那麼您可能可以使#define宏爲if ... else if ... else ...構造。

  • 如果案件中的公共部分相對較小,最好定義三種不同的功能。儘管如此,這可能會導致代碼重複數量適中。

  • 如果通用零件較大,請將它們移至功能併爲每個零件定義一個單獨的功能。如果「部分」函數變得太複雜,則可以使用宏來代替,儘管這會增加生成的目標代碼的大小。然後使用這些「部分」函數或宏爲這三種情況中的每一種創建一個單獨的函數。

最後兩個途徑將條件檢查減少到一個,最小或沒有代碼重複。 PS:通過「通用部分」,我的意思是執行代碼的那些部分,而不管這三種情況中的哪一種實際上是活動的。

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變量在這樣的情況下。你會無法將代碼重構爲單一條件。