天天看點

《代碼大全》學習筆記——第十八章,表驅動法

第十八章,表驅動法

前言

表驅動法是一種程式設計模型( 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、  使用表的另一項關鍵決策時把什麼内容放在表中。

把表驅動法寫成一個基礎庫。

繼續閱讀