編程學習——表驅動法

  近來閱讀《代碼大全》中「表驅動法」這一章節,發現其編程的思想在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

相關文章
相關標籤/搜索