美文网首页
代码规范 : 表驱动法(远离if switch)

代码规范 : 表驱动法(远离if switch)

作者: 卢二牛 | 来源:发表于2019-05-29 16:48 被阅读0次

表驱动法的准则

使用表驱动法的关注的两个核心问题:

  • 1 怎样从表中查询条目的问题;
  • 2 应该在表里面存什么
    两个核心问题都谈到了表,那么这个’表‘是什么东西呢?
    用过hash(哈希)的同学知道, 其内部是维护一个存放地址的表格,通过hash去快速得到,那么同样我们用来存放东西就可以描述成一个表

直接访问表

  • 例子一: 将数组作为表
// 下面原先的方法,是一个长长的swtich语句
String today = "周日";
Switch( dayForMonth % 7 ){
    case 0 : 
        today = "周日";
    case 1 : 
        today = "周一";   
    case 2 :
        today = "周二";   
    case 3 :
        today = "周三";   
    case 4 :
        today = "周四";   
    case 5 :
        today = "周五";   
    default:
        today = "周六";   
}

按照书上所说 , 要为switch 的 每一个分支加一 复杂度, 上述的复杂度是 7

// 使用表驱动
// 使用一个数组去存入一周的日期
String [] weekday = new String[]{"周日","周一","周二","周三",
    "周四","周五","周六"};
String today = weekday [ dayForMonth % 7 ];

瞬间清爽了很多。

直接访问表 方式二

  • 例子二 : 用二维的数组去存放一个结果集
// 原来的代码
if( (a && !c ) || (a && b && c)){
    category = 1 ;     
}else if( (b && ! a) || (a && c && !b)){
    category = 2 ;     
}else if ( c && !a && !b){
    category = 3 ;     
}else {
    category = 0 ;     
}

// 转换为 ( 这里 是 三维 的结果转成二维 去存放)
static int categoryTable[2][2]={
    //!b!c   !bc   b!c   bc
        0,   3,     2,    2, // !a    
        1,   2,     1,    1, // a
}
// 使用
category = categoryTable[1][0];

索引访问表

  • 例子三: 将hashMap作为表,那么首先要构建 hash的 key - value
// 存入 hashMap结构 key 是 weekday ,value 是 doSomething
String [] weekday = new String[]{"周日","周一","周二","周三",
    "周四","周五","周六"};
String [] doSomething = new String[]{"出游","开会","上班","学习",
    "运动","加班","休息","娱乐"}

// 构建hash 的键值对   
Map<String,Object> map = new HashMap();
for(int i = 0; i < weekday.length; i++){
    map.put( weekday[i],doSomething[i] );
}
// 取出hash 的值
public static String doWhat (String today){
    return map.get(today);
}

public static void main (String arge[]){
    system.out.pringf(doWhat(weekday[ dayForMonth % 7 ]));
}

阶梯访问表

  • 例子四: 用两个数组
    0-59 分是不及格 F级
    60- 79 是及格 E级
    80-84 是普通 D级
    85-89 是良好 C级
    90 - 94 是优秀 B级
    95-100 是太棒了 A级
    最重要的是, 我的表里面是存放了 区间的上界 , 用来区分等级
int [] grade = {59,79,84,89,94,100}; 
String [] level = {"F","E","D","C","B","A"},

public String getLevel (int grade){
    for( int i = 0 ; i < grade.length ; i++){
        if(grade <= grade[i]){
            return  level[i];
        }
    }
}

相关文章

  • 代码规范 : 表驱动法(远离if switch)

    表驱动法的准则 使用表驱动法的关注的两个核心问题: 1 怎样从表中查询条目的问题; 2 应该在表里面存什么两个核心...

  • 如何优化代码中大量的if/else,switch/case?

    如何优化代码中大量的if/else,switch/case?1、使用枚举2、善用Optional3、表驱动法4、提...

  • 表驱动法学习与实践-第一篇-2018/02/07

    什么是表驱动法 我认为,表驱动法,字如其名。就是用表格自身的逻辑来代替代码里的条件判断硬逻辑。举例如下:如果,我们...

  • 微习惯养成第二天——读代码大全18章 表驱动法

    第18章 表驱动法 18.1 表驱动法使用总则(General considerations in using t...

  • iOS表驱动法去除if-else简化逻辑

    今天介绍用表驱动法优化代码中的逻辑 去除复杂繁多的if-else判断 WMZStrategy(demo) 所谓表...

  • 代码大全2 - 表驱动法

    最近入手了 代码大全2,真实程序员的圣经啊,内容好高端啊,书中建议的初级程序员看的章节就是:表驱动法,真 NM N...

  • 表驱动法

    简书 賈小強转载请注明原创出处,谢谢! 表驱动法是一种编程模式(scheme)--从表里面查找信息而不使用逻辑语句...

  • 表驱动法

    Table-Driven Approach表驱动法 表驱动法,用查表的方法获取数值 我们平时查字典以及念初中时查《...

  • 表驱动法

    表驱动法:表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。事...

  • 表驱动法

    第一层大括号匿名内部类第二层动态语句块

网友评论

      本文标题:代码规范 : 表驱动法(远离if switch)

      本文链接:https://www.haomeiwen.com/subject/vzwytctx.html