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

先从一个常见的问题入手,在页面中显示今天的星期,如果还用下面的方式,那就需要好好看看本文章了
$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斤食物
........
那就是三维表驱动啦。

猜你喜欢

转载自orangeholic.iteye.com/blog/2210918
今日推荐