[NOTE] Updated August 27, 2023. This article may have outdated content or subject matter.
表驱动法(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的代码/该动作的子程序的引用。比如说状态机。
Author
lawrshen
LastMod
2023-08-27
(73a236c)
License
CC BY-NC-ND 4.0