表驱动法(Table-Driven Approach)简单说就是查表,目的是代替过多的条件分支语句。

基本使用

表驱动法适时取用可以比复杂的逻辑代码更简单,更容易修改,而且效率更高。

比如说字符类型划分,比起:

1
2
3
4
5
6
7
if ((( 'a' <= inputChar ) && ( inputChar <= 'z' )) || (( 'A' <= inputChar ) && ( inputChar <= 'Z' ))){
    charType = CharacterType.Letter;
} else if  (( inputChar = '' ) || ( inputChar = ',' ) || ( inputChar = '.' ) || ( inputChar = '!' ) || ( inputChar = '(' ) || ( inputChar = ')' ) || ( inputChar = ':' ) || ( inputChar = ';' ) || ( inputChar = '?') || ( inputChar = '-' )) {
    charType = CharacterType.Punctuation;
} else if (( '0' <= inputChar && inputChar <= '9' )) {
    charType = CharacterType.Digit;
}

直接用表查询更为直观:

1
charType = charTypeTable[inputChar];

拓展使用

对表驱动法的拓展主要可以从key和value两个角度考虑,既然本身表驱动法是一个hash表,可以由此做文章:

键值映射

例如,可以用下述表达式:max(min(66, age), 17) 来生成一个介于 17-66 之间的表键值。这样所有介于 1-17 直接的年龄转换成一个键值,例如 17,同时把所有超过 66 的年龄都转换成另一个键值,例如 66。

更进一步,可以把键值转换提取城独立子程序把键值转换提取城独立子程序。

索引访问

key还可以通过再多建一个索引表拓展。可以有一个数据表,多个索引表。

表格value

表里除了数据外,还可以存放action,描述该action的代码/该动作的子程序的引用。比如说状态机。