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的功能擷取成單獨的子程式。


 


重點


 


表格提供複雜邏輯與複雜繼承結構的替代方案


關鍵在於如何存取表格,可用直接存取、索引存取與階梯存取


另一個關鍵在於要把什麼內容放入表格之中





留言

這個網誌中的熱門文章

異世界NTR web版第三章 觀後感 喧賓奪主 ,反派實力過強

泛而不精的我被逐出了勇者隊伍 web第三章 觀後感 菲莉真能打; 露娜超爽der

持有縮小技能的D級冒險者,與聖女結婚並加入勇者團隊 漫畫 01-04 觀後感 大我與小我