C語言使用表驅動法重構if-else分支太多的情況
阿新 • • 發佈:2018-12-21
今天工作中遇到這麼一個情況:將25種字串分成17類,然後統計每一類中的數量
第一版程式碼簡單粗暴,直接上if-else,程式碼如下
if (strcasestr(str, "a")
{
type = 0;
}
else if (strcasestr(str, "b")
{
type = 1;
}
else if (strcasestr(str, "c")
{
type = 2;
}
類似於這種,當我寫到第5個分支的時候就寫不下去了,何況是25個,果斷放棄。
那用什麼方法代替if-else呢?以前寫C艹倒是有種設計模式可以解決這個問題,可在純C裡玩這麼玩,程式碼只會更加難以維護。
那麼有沒有適用於純C的解決方案呢?請教了一下百度大神,原來還有表驅動法可以很優雅的解決if-else分支太多的問題。
表驅動法簡單說就是將要判斷的資料存到一個數組裡,然後從這個數組裡查詢滿足條件的資料。最簡單的辦法就是將資料和陣列的索引進行繫結,但侷限性比較大,我遇到的情況不適用。既然不能和索引進行繫結,那就只能自己做資料對映,然後用迴圈替換掉判斷,遍歷陣列,依次判斷元素是否滿足條件,首先定義全域性繫結資料結構和全域性的只讀陣列
typedef struct st_type_ {
int type;
char *str;
}st_type;
static const st_type gTabtype[] = {
{1, "a"}, {2, "b"}, {2, "c"}, {3, "d"}, ...., {0, NULL}
};
然後是在函式中使用
int index = 0;
int type = -1;
while (gTabtype[index].str)
{
if (strcasestr(str, gTabtype[index].str))
{
type = gTabtype[index].type;
break;
}
++index;
}
if (type < 0)
return 0;
這樣的程式碼看起來就整潔多了,也更好維護。