背景
表驅動法,最早接觸這個概念是看《代碼大全》,之前也在不自覺的應用,本文對這一個概念再做簡短的總結。
表驅動法
說明這個概念之前最好先給出不使用這個概念的代碼,常見的需要使用表驅動的場景有如下三種情況:
場景1:不同條件不同數據
if (key = "Key A")
{
處理 Key A 相關的數據。
}
else if (key = "Key B")
{
處理 Key B 相關的數據。
}
場景2:不同條件不同行為
if (key = "Key A")
{
執行 Key A 相關的行為。
}
else if (key = "Key B")
{
執行 Key B 相關的行為。
}
場景3:不同條件依次執行
執行 Key A 相關的行為。
執行 Key B 相關的行為。
有了上面三種場景,再理解表驅動法就比較直觀了,直接看表驅動的代碼:
表 = {
"Key A": { "數據項": "數據", "行為項": "行為" },
"Key B": { "數據項": "數據", "行為項": "行為" }
};
注:很多語言都支持將“行為”作為一等公民,如:C和C++的函數指針、C#的委托、JS的函數等。
有這樣一個表以后,替換上面的三種代碼就非常直接了,這里不再贅述。
思考
使用OO替換表驅動法
對於某些不支持OO的語言,表驅動法非常有用,對於支持OO的語言,如果表中的數據項和行為項總數如果超過了3個,建議引入簡單的繼承體系,將數據項和行為項目提取為新類型體系的成員,然后將表修改為工廠。
表的Key能否為“行為”
當然可以,只是在從表中獲取行時,使用這個“行為”決定是否返回行。
如何用表驅動法模擬23個設計模式?
完全有可能的,有興趣的朋友可以模擬一下管道過濾器模式(這個是架構模式)。