<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 9 6 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482945 953122042 22 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 9 6 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482945 953122042 22 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:240%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; mso-list:l5 level1 lfo1; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:22.0pt;} h2 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; mso-list:l5 level2 lfo1; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} h3 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:3; mso-list:l5 level3 lfo1; font-size:16.0pt; font-family:"Times New Roman"; mso-font-kerning:1.0pt;} h4 {mso-style-next:正文; margin-top:14.0pt; margin-right:0cm; margin-bottom:14.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:156%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:4; mso-list:l5 level4 lfo1; font-size:14.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} h5 {mso-style-next:正文; margin-top:14.0pt; margin-right:0cm; margin-bottom:14.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:156%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:5; mso-list:l5 level5 lfo1; font-size:14.0pt; font-family:"Times New Roman"; mso-font-kerning:1.0pt;} h6 {mso-style-next:正文; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:133%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:6; mso-list:l5 level6 lfo1; font-size:12.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 {mso-style-next:正文; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:133%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:7; mso-list:l5 level7 lfo1; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt; font-weight:bold;} p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 {mso-style-next:正文; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:133%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:8; mso-list:l5 level8 lfo1; font-size:12.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoHeading9, li.MsoHeading9, div.MsoHeading9 {mso-style-next:正文; margin-top:12.0pt; margin-right:0cm; margin-bottom:3.2pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; text-indent:0cm; line-height:133%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:9; mso-list:l5 level9 lfo1; font-size:10.5pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:471870312; mso-list-type:hybrid; mso-list-template-ids:1043339892 -1726047862 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:971247941; mso-list-type:hybrid; mso-list-template-ids:560233632 -1726047862 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l2 {mso-list-id:994265767; mso-list-type:hybrid; mso-list-template-ids:186428830 -1726047862 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l3 {mso-list-id:1064332871; mso-list-type:hybrid; mso-list-template-ids:646881896 -1726047862 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l3:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l4 {mso-list-id:1091895932; mso-list-type:hybrid; mso-list-template-ids:749638012 -1726047862 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l4:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l5 {mso-list-id:1774326269; mso-list-template-ids:67698729;} @list l5:level1 {mso-level-number-format:chinese-counting-thousand; mso-level-style-link:"标题 1"; mso-level-suffix:none; mso-level-text:第%1章; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level2 {mso-level-number-format:none; mso-level-style-link:"标题 2"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level3 {mso-level-number-format:none; mso-level-style-link:"标题 3"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level4 {mso-level-number-format:none; mso-level-style-link:"标题 4"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level5 {mso-level-number-format:none; mso-level-style-link:"标题 5"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level6 {mso-level-number-format:none; mso-level-style-link:"标题 6"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level7 {mso-level-number-format:none; mso-level-style-link:"标题 7"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level8 {mso-level-number-format:none; mso-level-style-link:"标题 8"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} @list l5:level9 {mso-level-number-format:none; mso-level-style-link:"标题 9"; mso-level-suffix:none; mso-level-text:""; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:0cm; text-indent:0cm;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} table.MsoTableGrid {mso-style-name:网格型; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]--> 第十八章,表驱动法
前言
表驱动法是一种编程模型( scheme )——从表中查找信息而不是使用逻辑语句( if 或 else )。
对于表驱动法一定要慎用。如果逻辑很复杂,导致逻辑判断链很长,使用表驱动法有助于降低复杂度。否则,表驱动法只会增加复杂度。
18.1 表驱动法使用总则
使用表驱动法的两个问题:
<!-- [if !supportLists]-->1、 <!-- [endif]-->如何从表中查询条目。三种方法:直接访问( Directory access )表,索引访问( Index access )表,阶梯访问( Stair-step access )表。
<!-- [if !supportLists]-->2、 <!-- [endif]-->表中要保存什么。可能是数据,函数指针,对象实例等。
18.2 直接访问表
灵活的消息格式:
这里介绍了一个通用的表驱动法。核心的思想仍然是通过抽象,隔离变化,使变化的影响降低到最低,使代码对变化是友好的。
构造查询键值:
<!-- [if !supportLists]-->1、 <!-- [endif]-->复制信息从而能够直接使用键值。
<!-- [if !supportLists]-->2、 <!-- [endif]-->转换键值以使其能够直接使用。对键值进行转换,得到直接的索引值。这里可以在增加一个新的查询表。
<!-- [if !supportLists]-->3、 <!-- [endif]-->把键值转换提取层单独的子程序。
18.3 索引访问表
18.4 阶梯访问表
基本思想:表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。
注意细节:
<!-- [if !supportLists]-->1、 <!-- [endif]-->留心端点。
<!-- [if !supportLists]-->2、 <!-- [endif]-->考虑用二分查找代替顺序查找。
<!-- [if !supportLists]-->3、 <!-- [endif]-->考虑用索引访问代替阶梯访问。索引访问速度快,占内存。阶梯访问速度慢,省内存。
<!-- [if !supportLists]-->4、 <!-- [endif]-->把阶梯中的查询操作提取成单独的子程序。
18.5 表查询的其他示例
CHECKLIST: Table-Driven Methods核对表:表驱动法<!-- [if !supportLists]-->1、 <!-- [endif]-->你考虑过把表驱动法作为复杂逻辑的替代方案吗? <!-- [if !supportLists]-->2、 <!-- [endif]-->你考虑过把表驱动法作为复杂继承结构的替代方案吗? <!-- [if !supportLists]-->3、 <!-- [endif]-->你考虑过把数据存储在程序外部,以便在不用修改代码的情况下,更改这些数据吗? <!-- [if !supportLists]-->4、 <!-- [endif]-->如果无法用一种简单的数组索引去访问表,那么你把计算访问键值的功能提取成单独的子程序,而不是在代码中重复的计算键值了吗? |
本章要点
<!-- [if !supportLists]-->1、 <!-- [endif]-->表提供了一种复杂的逻辑和继承结构的替代方案。如果你发现自己对某个程序的逻辑和继承关系感到困惑时,那么问问自己它是否可以通过一个查询表来简化。
<!-- [if !supportLists]-->2、 <!-- [endif]-->使用表的一项关键决策时如何去访问表。你可以采取直接访问,索引访问,或者阶梯访问。
<!-- [if !supportLists]-->3、 <!-- [endif]-->使用表的另一项关键决策时把什么内容放在表中。
把表驱动法写成一个基础库。