表驅動編程方法 table-driven programming

      最近寫了一段這樣的代碼。代碼的功能是,通過函數function()返回的錯誤代碼,生成一段說明該代碼錯誤的log。

      最開始我的代碼是這樣寫的:

enum error_t{
ERROR0=0,
ERROR1,
ERROR2,
ERROR3
};

error_t function()
{
   //......
}

int main()
{
    error_t err_code;
    err_code = function();
    switch(err_code)
    {
       case ERROR0:
           printf("Success.");
           break;
       case ERROR1:
           printf("Error1 occured.");
           break;
       case ERROR2:
           printf("Error2 occured.");
           break;
       case ERROR3:
           printf("Error3 occured.");
           break;
       default:
           printf("undefined error occured.");
           break;       
    }

    return 0;
}


       這段代碼簡單的時候,還是可以清楚做了什麼的。但是一旦error的類型比較冗長時,代碼就不夠清晰了。另外,這麼長長的一段代碼掩蓋了代碼的主幹,頗有宣兵奪主之嫌。

       每個case裏面都進行printf,這是一種重複代碼的行爲。因爲它們都進行printf,所以可以提煉出這個共同點。在導師的指導下,改成這樣:

enum error_t{
ERROR0=0,
ERROR1,
ERROR2,
ERROR3
};

char err_msg[][256] = {
"Success",
"Error1 occured.",
"Error2 occured.",
"Error3 occured.",
"Undefined error occured."
};

void print_err(error_t err_code)
{
    printf("%s", err_msg[err_code]);
}

int main()
{
    error_t err_code;
    err_code = function();
    print_err(err_code);
    return 0;
}

       這樣代碼清晰了很多,使程序變得更加清晰。這種方法叫做表驅動法(table-driven programming)。表驅動的方法屬於數據驅動編程的一種典型代表。數據驅動編程的核心出發點是相對於程序邏輯,人類更擅長於處理數據。數據驅動編程就是通過把程序邏輯的複雜度轉移到人類更容易處理的數據中來,從而達到控制複雜度的目標。在上面的例子中,隨着error type種類越來越多,case分支的語句會越來越長,然後整段switch的邏輯是沒有變化的。通過表驅動法,將容易變化的消息和不容易變化的邏輯分離。

       它不是一個全新的編程模型:它只是一種設計思路。更加豐富的內容可以看看《unix編程藝術》。我也是淺淺地瞭解了這麼多。想了解更多表驅動編程的例子,可以點這裏

發佈了40 篇原創文章 · 獲贊 43 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章