CODE COMPLETE 2 軟體開發實務指南 第18章 表格驅動法
第十八章主題是表格驅動法,表格驅動法是一種程式設計模式,用查表法找資訊而不用寫程式推算。
表格驅動法使用總則
使用查表法lookup table,可以取代 if/else 與 switch/case語句。
使用表格驅動法的兩個問題
怎樣從表中查詢項目?一些資料很難直接用查表法查詢。
表格中存放什麼?有時存放資料,有時存放動作。
三種查表法
直接存取(Direct access)
索引存取(Indexed access)
階梯存取(Stair-step access)
直接存取表
直接用Key可以得到想要的資料,例如取得每個月的天數,可用直接存取表,用一個陣列存放每一個月的天數。
表格驅動法的優勢是可以把資料放在檔案中,程式執行時再讀取這些資料。保險費率變化的時候,可以在不改程式的情況下,調整保險費率。
例子:靈活的訊息格式
圖18-2 與 圖18-3 描述問題,資訊不是按照特定順序儲存,每條訊息用ID標示。除了ID之外,每種訊息有自己的格式。要列印儲存在一份檔案中的訊息。
邏輯基礎法
讀取每一條訊息
檢查ID
呼叫解析程式,20種訊息需要20個子程式
物件導向的方法
物件導向會用抽象的訊息物件,並為每種訊息類別衍生一個子類別。20種訊息中每一種都要有自己的訊息列印子程式。
表格驅動法
用表格驅動法只要偵測資料的型態,再把值列印出來。文中有六種資料型態,用一個switch/case即可完成任務,不需要寫二十個函數。
用物件導向多型的方法還可以再簡化,不使用switch/case 。書中有C++的範例。
建構查詢鍵值
看範例比較容易懂,保險費率案例65以上與17以下不能夠直接用年齡作為Key,有三種方法解決問題
複製資訊進而能夠直接使用鍵值
複製法簡單,缺點是會增加多餘的資訊。
轉換鍵值以使其能夠直接使用
用min()與max()轉換
把鍵值轉換擷取成獨立的子程式
寫一個函數轉換或是用map方式轉換。
索引存取表
要查詢兩次以上才能得到資訊。
優點如下
可以節省空間
可以根據不同的特徵排序
編寫到表格中的資料比嵌入程式中的資料容易維護
階梯存取表
這段看圖18-5 還有VB範例就懂,根據分數評定等級的情況適合使用階梯存取表。
注意事項
留心端點
考慮用二分搜尋取代循序搜尋
考慮用索引存取來取代階梯法
階梯法搜尋時間較久,用索引存取可以用空間換取時間。
核對表:表格驅動法
考慮用表格驅動法作為複雜邏輯的替代方案
考慮用表格驅動法作為複雜繼承結構的替代方案
考慮將表格資料儲存在外部並在執行期間讀入,以便在不修改程式碼的情況就可以改變資料
若無法像陣列索引簡單存取表格,可把計算Key的功能擷取成單獨的子程式。
重點
表格提供複雜邏輯與複雜繼承結構的替代方案
關鍵在於如何存取表格,可用直接存取、索引存取與階梯存取
另一個關鍵在於要把什麼內容放入表格之中
留言
張貼留言