1. 程式人生 > >C語言使用表驅動法重構if-else分支太多的情況

C語言使用表驅動法重構if-else分支太多的情況

今天工作中遇到這麼一個情況:將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;

這樣的程式碼看起來就整潔多了,也更好維護。