第十八章,表驅動法
前言
表驅動法是一種程式設計模型( scheme )——從表中查找資訊而不是使用邏輯語句( if 或 else )。
對于表驅動法一定要慎用。如果邏輯很複雜,導緻邏輯判斷鍊很長,使用表驅動法有助于降低複雜度。否則,表驅動法隻會增加複雜度。
18.1 表驅動法使用總則
使用表驅動法的兩個問題:
1、 如何從表中查詢條目。三種方法:直接通路( Directory access )表,索引通路( Index access )表,階梯通路( Stair-step access )表。
2、 表中要儲存什麼。可能是資料,函數指針,對象執行個體等。
18.2 直接通路表
靈活的消息格式:
這裡介紹了一個通用的表驅動法。核心的思想仍然是通過抽象,隔離變化,使變化的影響降低到最低,使代碼對變化是友好的。
構造查詢鍵值:
1、 複制資訊進而能夠直接使用鍵值。
2、 轉換鍵值以使其能夠直接使用。對鍵值進行轉換,得到直接的索引值。這裡可以在增加一個新的查詢表。
3、 把鍵值轉換提取層單獨的子程式。
18.3 索引通路表
18.4 階梯通路表
基本思想:表中的記錄對于不同的資料範圍有效,而不是對不同的資料點有效。
注意細節:
1、 留心端點。
2、 考慮用二分查找代替順序查找。
3、 考慮用索引通路代替階梯通路。索引通路速度快,占記憶體。階梯通路速度慢,省記憶體。
4、 把階梯中的查詢操作提取成單獨的子程式。
18.5 表查詢的其他示例
CHECKLIST: Table-Driven Methods核對表:表驅動法1、 你考慮過把表驅動法作為複雜邏輯的替代方案嗎? 2、 你考慮過把表驅動法作為複雜繼承結構的替代方案嗎? 3、 你考慮過把資料存儲在程式外部,以便在不用修改代碼的情況下,更改這些資料嗎? 4、 如果無法用一種簡單的數組索引去通路表,那麼你把計算通路鍵值的功能提取成單獨的子程式,而不是在代碼中重複的計算鍵值了嗎? |
本章要點
1、 表提供了一種複雜的邏輯和繼承結構的替代方案。如果你發現自己對某個程式的邏輯和繼承關系感到困惑時,那麼問問自己它是否可以通過一個查詢表來簡化。
2、 使用表的一項關鍵決策時如何去通路表。你可以采取直接通路,索引通路,或者階梯通路。
3、 使用表的另一項關鍵決策時把什麼内容放在表中。
把表驅動法寫成一個基礎庫。