表驱动法是一种编程模式----从表里面查找信息而不适用逻辑语句(if和case)。
表提供了一种复杂的逻辑和继承结构的替换方案。如果你发现自己对某个应用程序的逻辑或者继承树关系感到困惑,那么问问自己它是否可以通过一个查询表来加以简化。
使用表的一项关键决策是决定如何去访问表。你可以采取直接访问、索引访问或者阶梯访问。
使用表的另一项关键决策是决定应该把什么内容放入表中。
下面是个例子:
原文地址
:表驱动法
驱动表不是什么高深的东西,在《代码大全2》中有详细的讲解。
看一个简单的例子:
2012过去了,仅存的人类从事原始的生产劳作,以集体为单位。很不幸2013年人类生产食物的总和有限,不得不根据对象的
特点进行食物的分配。最初的规则如下:
20岁以上的男人,每人分配100斤食物
20岁以下的男人,每人分配80斤食物
20岁以上的女人,每人分配80斤食物
20岁以下的女人,每人分配60斤食物
于是你写了如下的代码
int getFood(bool isMan,bool ageMoreThan20)
{
if(isMan)
{
if( ageMoreThan20)
{
return 100;
}
else
{
return 80;
}
}
else
{
if( ageMoreThan20)
{
return 80;
}
else
{
return 60;
}
}
}
于是你很满意,因为你圆满完成了人类食物的分配工作,保证了大家尽块可能吃饱。但是突然,一群大胖子找到了
把你狠揍你一顿,最后你搞明白了,原来这样的分配方式让他们吃不饱。你很自责与愧疚,于是要改这个算法,增加了
这样的规则:
20岁以上的男胖子120斤
20岁以下的男胖子100斤
20岁以上的女胖子100斤
20岁以下的女胖子80斤
代码就变成了这样
int getFood(bool isMan,bool ageMoreThan20,bool isFatMan)
{
if(isMan)
{
if( ageMoreThan20)
{
if(isFatMan)
{
return 120;
}
else
{
return 100;
}
}
else
{
if(isFatMan)
{
return 100;
}
else
{
return 80;
}
}
}
else
{
if( ageMoreThan20)
{
if(isFatMan)
{
return 100;
}
else
{
return 80;
}
}
else
{
if(isFatMan)
{
return 80;
}
else
{
return 60;
}
}
}
}
写完这段代码,你揉着太阳穴,并感到莫名的紧张和不安,为啥呢?你看到太多的if else;看到太多的代码;同时你想到
了代码的可读性、可维护性、可扩展性。“擦,下次再增加一个判断因子的话。。。。”
代码大全告诉我们,当遇到太多if else,已经深成的嵌套的时候,你应该告诉自己,coder就应该对自己狠一点,把现有的
的代码删除吧,用驱动表吧,这才能拯救人类。
驱动表:其实就是一个多维数组,他的维数由变项的数量决定,如果变项为3,则是一个3维数组,每个元素值代表着3种变项
的一种具体的组合对应的值;这样我们就把对if else的维护,变成了对数组的维护。代码可以是这样。
int val[2][2][2];
该数组的一维代表性别,0为男人,1为女人
该数组的二维代表年龄,0为大于20,1小于20岁
该数组的三维代表是否是胖子,0为是胖子,1代表不是胖子
所以val[0][0][0]=120表示20岁以上的男胖子分配120斤食物。
对这个数组的8个值进行初始化
int getFood(bool isMan,bool ageMoreThan20,bool isFatMan)
{
return val[isMan][ageMoreThan20][isFatMan];
}
驱动表的优点在于:
1,维护数组比维护if else容易
2, 代码简洁
3,性能高(直接是偏移地址的运算)
驱动表实际是一个值的存取和访问,这个值可以是一个具体的值、一个处理方法的引用、一个对象。而对这个值的访问
可以是直接寻址,如例子所示、也可以是索引(key值为字符串)、也可以是阶梯形式。
分享到:
相关推荐
在CRC表驱动程序中,这个多项式被用来生成一个查表,这个表用于快速计算出校验码。 标题"CRC table-driven Program with C CODE"指出,这是一个使用C语言编写的CRC校验程序,它利用了查表法来提高计算效率。这种...
在使用VMware vSphere 7.0时,可能会遇到虚拟机硬盘无法编辑或者无法连接到Profile-Driven Storage Service的问题。这种情况通常与存储配置、vSphere Client连接问题、虚拟机设置或者服务状态有关。以下是一些可能...
测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,强调在编写实际代码之前先编写测试用例。这种做法旨在提高代码质量、可维护性和减少缺陷。《Test-Driven Development By Example》是一本由...
### CRC32算法详解:从Bit到Table-Driven CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信领域的错误检测方法。CRC32算法是CRC的一种常见实现,它通过生成一个固定长度的校验码来确保数据...
然而,在使用`<mvc:annotation-driven />`元素时,有时会出现与自定义拦截器的冲突问题。这个问题通常出现在当我们试图同时配置基于注解的控制器处理和自定义拦截器时,Spring可能无法正确地处理这些组件的执行顺序...
标题中的"Table-driven CRC"指的是使用查表法实现CRC计算。这种方法通常比直接计算更快,因为它减少了CPU中的算术操作。查表法是预先计算出所有可能的8位或16位CRC结果并存储在一个查找表中,当需要计算CRC时,通过...
Test-driven development replies to this contradiction with a paradox-test the program before you write it. A new idea? Not at all. Since the dawn of computing, programmers have been specifying the ...
Spring 的 Annotation-Driven 配置事务管理器详解(多数据源配置) Spring 框架提供了强大的事务管理机制,通过使用 Annotation-Driven 配置,可以方便地管理事务。在多数据源配置中,spring 的 Annotation-Driven...
VMware vSphere 磁盘无法增加容量,报错:无法连接到Profile-Driven Storage Service
Test-driven development (TDD) is a development approach that relies on a test-first procedure that emphasises writing a test before writing the necessary code, and then refactoring the code to ...
Test-driven development (TDD) is a modern software development practice that can dramatically reduce the number of defects in systems, produce more maintainable code, and give you the confidence to ...
关于DDD可参考InfoQ的Mini Book Domain Driven Design Quickly , 还有 Banq 的文章 实战DDD(Domain-Driven Design领域驱动设计), 和 领域模型驱动设计(DDD)之模型提炼 。 本书分为四部分,第一部分讲述了领域模型...
Designing Event-Driven Systems_Concepts and Patterns for Streaming Services with Apache Kakfa, published by OReilly
首先,`mvc:annotation-driven`是一个XML配置元素,它简化了对Spring MVC应用中注解驱动功能的配置。通过添加这个元素,我们无需手动注册如`HandlerMapping`、`HandlerAdapter`、`ConversionService`、`Validator`等...
《Cable-Driven Parallel Robots》 (作者:Tobias Bruckmann • Andreas Pott) 英文无水印原版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权...
在软件工程领域,模型驱动开发(Model-Driven Development, MDA)是一种先进的软件设计方法,它强调通过创建和操作软件系统模型来驱动整个开发过程。MDA由Object Management Group (OMG)提出,旨在将软件开发从传统...
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发的方法论,它由Eric Evans在其2004年的同名书籍《领域驱动设计:软件核心复杂性应对之道》中提出。DDD的核心思想是,软件系统的复杂性不仅仅是由技术...
### 测试驱动的Java开发(Test-Driven Java Development) #### 概述 《测试驱动的Java开发》一书由Viktor Farcic与Alex Garcia合著,于2015年由Packt Publishing出版。本书深入探讨了如何将测试驱动开发(TDD)原则...
Test-Driven Development (TDD) is a methodology that helps you to write as little as code as possible to satisfy software requirements, and ensures that what you've written does what it's supposed to ...