`
OrangeHolic
  • 浏览: 259609 次
  • 来自: 北京
社区版块
存档分类
最新评论

减少if...else...的表驱动

    博客分类:
  • PHP
阅读更多
先从一个常见的问题入手,在页面中显示今天的星期,如果还用下面的方式,那就需要好好看看本文章了
$result = '';
switch (date('w')){
    case 0:
        $result ='星期日';break;
    case 1:
        $result ='星期一';break;
    case 2:
        $result ='星期二';break;
    case 3:
        $result ='星期三';break;
    case 4:
        $result ='星期四';break;
    case 5:
        $result ='星期五';break;
    default:
        $result ='星期六';
}
return $result;


编程人员一般采用下面的方式,将星期组织成一个数组(可以称作表),安卓索引取出对应的汉字。
$map= array('星期日','星期一','星期二','星期三','星期四','星期五','星期六');
return $map[date('w')];


这就是表驱动,在大家的编程生涯中或多或少都接触过,只是没有提出来总结一下,现在是不是觉得自己的实现方式很高大上了。

表驱动法是一种编程模式,从表里面查找信息而不是使用逻辑语句(if…else…switch)。

上面只是一维表驱动,下面扩展正多维,先看一个二维的例子,这也是表驱动经典的例子了。

《星际穿越》(原来例子不是这样描述滴)中人类生产食物的总和有限,不得不根据对象的特点进行食物的分配,规则如下

18岁以下男可以领取100斤食物
18-60岁男可以领取120斤食物
60岁以上男可以领取100斤食物
18岁以下女可以领取90斤食物
18-60岁女可以领取110斤食物
60岁以上女可以领取95斤食物

if....else...方式

function getFoodWeight($age, $gender)
{

    if ($age < 18) {
        if ($gender) {
            $food = 100;
        } else {
            $food = 90;
        }
    } else if ($age > 60) {
        if ($gender) {
            $food = 100;
        } else {
            $food = 95;
        }
    } else {
        if ($gender) {
            $food = 120;
        } else {
            $food = 110;
        }
    }
    return $food;

}


表驱动方式,第一维度为年龄,第二维度为性别
$config = array(
    array(90, 100),
    array(110, 120),
    array(95, 100),
);

function getFoodWeight($age, $gender)
{
    global $config;
    $ageDimension = ($age - 18 > 0) + ($age - 60 > 0);
    $genderDimension = $gender;
    return $config[$ageDimension][$genderDimension];
}

表驱动方式是不是使代码能够使代码简单、明了,便于维护。

忽然有一天开始加入身材胖、正常、瘦因子进行食物分发,就是如下的规则
18岁以下男胖子可以领取100斤食物
18岁以下男瘦子可以领取100斤食物
........
那就是三维表驱动啦。
分享到:
评论

相关推荐

    Excel VBA 基础教程

    目 录 一、VBA语言基础...................................................................................................................1 第一节 标识符....................................................

    EXCEL编程VBA高级教程

    目录 一、VBA语言基础...................................................................................................................1 第一节标识符.....................................................

    ExcelVBA程序设计.doc

    5.IF…THEN…ELSEIF语句 118 6.嵌套的IF…THEN语句 119 7.SELECT CASE语句 120 8.和CASE子句一起使用IS 121 9.确定CASE子句里数值的范围 122 10.在CASE子句里确定多个表达式 123 11.接下来… 123 第六章 在VBA中重复...

    Excel_VBA教程

    5.IF…THEN…ELSEIF语句 118 6.嵌套的IF…THEN语句 119 7.SELECT CASE语句 120 8.和CASE子句一起使用IS 121 9.确定CASE子句里数值的范围 122 10.在CASE子句里确定多个表达式 123 11.接下来… 123 第六章 在VBA中重复...

    Visual Basic 2010入门经典.part1.rar

    13.1.2 使用ElseIf进行复杂的决策 223 13.1.3 嵌套的If...Else结构 224 13.1.4 在一条Case语句中考虑多个可能的值 225 13.1.5 创建Select Case示例 225 13.1.6 创造性地使用Select Case 227 13.2 在过程中使用...

    Visual Basic 2010入门经典.part2.rar

    13.1.2 使用ElseIf进行复杂的决策 223 13.1.3 嵌套的If...Else结构 224 13.1.4 在一条Case语句中考虑多个可能的值 225 13.1.5 创建Select Case示例 225 13.1.6 创造性地使用Select Case 227 13.2 在过程中使用...

    用单片机设计的4位密码锁

    else if((p0_3==0x0)&&(f0==0)) { cmp(); if(f0!=1){clean();} if(f0==1){counter=0;p0_3=1;p0_0=0; clean();} } else { counter++; if((counter)) { ...

    华为编程开发规范与案例

    电话60640001拨打01160010001两次,使四个群都有机会被计费,取话单后浏览话单发现对11群计费计次表话单出中继群号不正确,其它群的计次表中出中继群号正常。 处理过程: 与开发人员在测试组环境多次重复以上步骤...

    整理后java开发全套达内学习笔记(含练习)

    不能直接 if (i==0.01)... 默认,整数是int类型,小数是double类型 long类型值,需跟L或l在数据后;float类型要跟f或F;或强制类型转换 科学计数法:12.5E3 类型转换默认序列: byte &gt; short &gt; int &gt; long &gt; ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    例如数据表中用户选择字段方式的改变,用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要...

    网管教程 从入门到精通软件篇.txt

    AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式 ANI:Windows系统中的动画光标 ARC:LH ARC的压缩档案文件 ARJ:Robert Jung ARJ压缩包文件 ASD:Microsoft Word的自动保存文件;...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...

    代码语法错误分析工具pclint8.0

    如果将pclint集成到SourceInsight中,那就相当于给SourceInsight增加了一个C/C++编译器,而且它的检查更严格,能发现一些编译器发现不了的问题,可以大大减少程序中潜伏的BUG。这样的话,相信更多人会喜欢Source...

    libusb-1.0.9

    如果你想知道内核是否可用的,使用libusb_kernel_drive_active,如果返回值为1,对于你的设备内核可以加载驱动。 批量传输 为了在你的设备上使用批量传输,你应该获得为你的USB设备获得一个设备句柄,并且你应该知道...

    java经典面试2010集锦100题(不看你后悔)

    if(i&gt;999) { _______________ } } } } 下面对程序的横线处填写不同语句的分析正确的是:(选择一项) A) 填充 break 使程序能够有退出循环的可能性。 B) 填充 continue 将使程序成为死循环,永远...

    C++MFC教程

    Windows系统是一个消息驱动的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。 1、消息的组成:一个消息由一个消息名称(UINT),和...

    关于ds18b20程序

    }else { PullDownDQ(); Delayus(12); //86us(60-120) } ReleaseDQ(); Delay2us(); //2us(&gt;1us) } /******************************************************** * 写Byte DS18B20 * ****************************...

Global site tag (gtag.js) - Google Analytics