近來閱讀《代碼大全》中「表驅動法」這一章節,發現其編程的思想在C語言實際編程頗有指導做用,就想着將「表驅動法」應用於實際項目中。html
任務需求:函數在進行業務處理以前,須要對外部輸入的數據類型(dataType),數據索引(dataIndex),數據長度(dataLen)進行正確性檢查編程
若是按照if-else結構進行判斷的話,代碼可能以下所示:函數
enum DATA_TYPE{APPLE=0,PEAR=1,BANANA=2}; enum DATA_LEN{APPLE_LEN=20,PEAR_LEN=30,BANANA_LEN=40}; #define STATE_SUCCESS 0 #define STATE_PARAERROR 1 //經過多重if-else語句進行參數檢查 int CheckParaByMulIF(int dataType,int dataIndex,int dataLen) { if (dataType == APPLE && dataIndex == 0 && dataLen == APPLE_LEN) { return STATE_SUCCESS; }else if (dataType == APPLE && dataIndex == 1 && dataLen == APPLE_LEN) { return STATE_SUCCESS; }else if (dataType == PEAR && dataIndex == 0 && dataLen == PEAR_LEN) { return STATE_SUCCESS; }else if (dataType == PEAR && dataIndex == 1 && dataLen == PEAR_LEN) { return STATE_SUCCESS; }else if (dataType == BANANA && dataIndex == 0 && dataLen == BANANA_LEN) { return STATE_SUCCESS; } return STATE_PARAERROR; }
剛開始寫完這段代碼以後,以爲任務完成了,能夠進行後續的開發,可是等到了一段時間以後,代碼走查階段/給項目組其餘人員講述這段代碼時,發現本身閱讀這段代碼特別費勁,並且對這段代碼是否「真正正確」沒有信心。經過「表驅動法」的學習,上述函數能夠修改成下述格式:學習
typedef struct{ enum DATA_TYPE type; int index; enum DATA_LEN len; }ParaTable; //經過查表方法進行參數檢查 int CheckParaByTable(int dataType,int dataIndex,int dataLen) { ParaTable paraTableList[] ={ {APPLE,0,APPLE_LEN}, {APPLE,1,APPLE_LEN}, {PEAR,0,PEAR_LEN}, {PEAR,1,PEAR_LEN}, {BANANA,0,BANANA_LEN} }; int listLen = sizeof(paraTableList)/sizeof(paraTableList[0]); int i; for (i=0;i<listLen;i++) { if (dataType == paraTableList[i].type && dataIndex == paraTableList[i].index && dataLen == paraTableList[i].len) { return STATE_SUCCESS; } } return STATE_PARAERROR; }
對比二者的實現,可發現面對這種多參數檢查的問題,用表驅動法比多重if-else方法更聰明些。spa
參考資料:code
一、《代碼大全2》htm
二、C語言表驅動法編程實踐 http://www.cnblogs.com/clover-toeic/p/3730362.htmlblog