`
雪飘寒
  • 浏览: 30461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用表驱动简化复杂逻辑判断

 
阅读更多

 

废话不说,看代码:
 if (jtdw == 1 || jtdw == 2 || jtdw == 7 || jtdw == 8 || jtdw == 15
                || jtdw == 19 || jtdw == 20 || jtdw == 21) {
            ajlb = 1;
        } else if (jtdw == 3 || jtdw == 4 || jtdw == 5 || jtdw == 6
                || jtdw == 16) { // 2008-04-16 add 16
            ajlb = 2;
        } else if (jtdw == 17) {
            ajlb = 6;
        } else if (jtdw == 9) {
            ajlb = 8;
        } else if (jtdw == 13 || jtdw == 18) {
            ajlb = 13;
        } else if (jtdw == 10 || jtdw == 22) {
            ajlb = 11;
        } else if (jtdw == 23) { // 2009-12-1 对于立案二庭的案件,点击节点
            ajlb = 2;
        } else {
            ajlb = 12;
        }
      
这段代码在程序中出现了多次,基本就是有些地方多出来一个判断,有些地方少了一个判断而已,应该提取成公共的方法,简化代码,方便复用。这不是主要问题,主要问题在于:
 
1. 代码太长,难理解:不解释。
2. 可维护性低:比如里面两个有注释的地方,都是后期添加的,以后修改或增加的判断多了,都会使现有的程序更难理解。
 
其实,这种情况在程序中出现很频繁,在我们的系统中出现的更是频繁。应对这种复杂的逻辑判断有很多很多方法,这里介绍一种叫做表驱动的方法。
 
人类阅读复杂数据结构远比复杂的控制流程容易,或者说数据驱动开发是非常有价值的。
《代码大全 2》声称这个是表驱动法。
 
表驱动法就是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里。 
这样不仅代码看起来简明,而且后面如果数据或者别的什么改变的话维护起来也相对简单。
比如,将上面的 ajlbjtdw 存储到类似的一个表的结构中(如 Map),业务逻辑中只需
ajlb = getAjlbByJtdw(jtdw);
 
就可以替换原来的很多行的判断,以后修改时,只需在 map中添加一个即可,不影响业务逻辑流程。
 
   private static Map<Integer, Integer> JTDW_AJLB = new HashMap<Integer, Integer>();
    static {
        JTDW_AJLB.put(1, 1);//注释
        JTDW_AJLB.put(2, 1);
        JTDW_AJLB.put(7, 1);
        JTDW_AJLB.put(8, 1);
      .........
    }
    public static int getAjlbByJtdw(int jtdw) {
        return JTDW_AJLB.get(jtdw);
    }
 
 
表驱动的好处是消除代码里面到处出现的 ifelse swith语句,让凌乱代码变得简明和清晰。对简单情况而言,表驱动方法可能仅仅使逻辑语句更容易和直白,但随着逻辑的越来越复杂,表驱动法就愈发有吸引力。
 
补充解释一下表驱动方法:
使用表驱动的主要要明白:如何构建表确定什么样的规则来访问表里的数据。
表驱动的访问方式主要有三种: 直接访问、索引访问、阶梯访问。
 
1. 直接访问:key value格式


 
经典的例子,根据月份取天数,非常好理解、不解释,看代码:
   
 public int getMonthDays(int month) {
        int days = 0;
        if (1 == month) {
            days = 31;
        } else if (2 == month) {
            days = 28;
        } else if (3 == month) {
            days = 31;
        } else if (4 == month) {
            days = 30;
        } else if (5 == month) {
            days = 31;
        } else if (6 == month) {
            days = 30;
        } else if (7 == month) {
            days = 31;
        } else if (8 == month) {
            days = 31;
        } else if (9 == month) {
            days = 30;
        } else if (10 == month) {
            days = 31;
        } else if (11 == month) {
            days = 30;
        } else if (12 == month) {
            days = 31;
        }
        return days;
    }
 
使用表驱动的直接访问方式消除 if语句
   
 private static int MONTH_DYAS[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 };

    public int getMonthDays(int month) {
        return MONTH_DYAS[(month - 1)];
    }
 
 
2. 索引访问


 
这种方式用于解决嵌套的 if效果比较明显,比如Map<String,Map<String,String>>,外层Map 存储内层 Map的索引,内层Map存储值,就不用代码举例了。
 
3. 阶梯访问,主要适用于无规则数据。比如在某个范围区间内,对应某个值。这里就不用代码举例了。


 
 
表驱动好处:
1. 在适当环境下,使用它能够使代码简单、明了。
    2. 修改容易(易维护)、效率更高。
    3. 表驱动法的一个好处就是能够大量消除代码中 if - else swith 判断。
缺点:这是一个用数据结构替换复杂流程控制的方法, 某些情况下 浪费空间,有时查找可能没有直接判断快,效率低。
 
   表驱动的一个很重要的问题是如何去构建查询的键值。主要有以下几种方式:
1. 直接使用有规则的数据作为键值
2. 赋值信息从而能够直接使用键值
3. 在特定情况下写代码转换键值使其能够直接使用
4. 提取出键值转换函数来,单独的函数来处理表的键值生成
 
  
  • 大小: 14.7 KB
  • 大小: 47.3 KB
  • 大小: 24.6 KB
3
2
分享到:
评论
2 楼 AliceHR520 2013-03-01  
学习了
1 楼 chinaagan 2013-02-28  
代码大全?

相关推荐

    昆仑通态脚本驱动开发工具使用指导手册

    ### 昆仑通态脚本驱动开发工具使用指导手册知识点详解 #### 一、脚本驱动概述 **脚本驱动**是一种特殊的驱动程序,用于在昆仑通态的MCGS系列组态软件中实现与外部设备的数据交互。通过编写特定的脚本语言,可以...

    使用Protothread简化嵌入式系统中的顺序流控制

    原先的实现需要复杂的条件判断和状态转换,而Protothread实现仅需几行代码便能清晰地表达相同的逻辑。这种线性结构的代码更易于编写和维护,并且能够直观地反映出实际的工作流程。 总之,Protothread作为一种适用于...

    易语言源码易语言取驱动器列表源码.rar

    请注意,实际开发中可能需要处理API函数调用的错误,以及对驱动器类型的判断和处理。此外,易语言还提供了丰富的标准库和扩展库,可以简化这部分工作,例如,使用易语言的“系统.磁盘.获取驱动器列表”命令,可以...

    深入数据驱动编程之表驱动法的详解

    使用表驱动法改进 为了克服上述问题,我们可以采用表驱动法来优化程序设计。具体步骤如下: - 定义一个结构体`EVENT_DRIVE`,用于存储每个事件的处理信息。 - 创建一个数组`eventdriver[]`,其中包含所有可能的...

    万能无线网卡驱动

    《万能无线网卡驱动:解决网络连接问题的利器》 在我们的日常生活中,网络连接的重要性不言而喻。无论是工作、学习还是娱乐,都离不开...然而,对于复杂的硬件问题,用户仍需具备一定的电脑知识,以便准确判断和处理。

    Linux中总线、设备、驱动是如何关联的?

    在Linux系统中,总线、设备和驱动三者之间通过一系列复杂但有序的机制紧密联系在一起。这种联系主要体现在以下几个方面: ### 总线的角色 总线在Linux设备模型中扮演着组织者和协调者的角色。`struct bus_type` ...

    Table Driven Methods

    使用表驱动法,我们可以创建一个映射颜色名称到RGB值的表格,然后编写一段代码,根据用户输入查找并返回对应的RGB值。 总之,表驱动方法是一种强大的编程策略,尤其适用于处理多条件分支和动态规则。它提高了代码的...

    ZYNQ 7010实现以太网UPD驱动(FPGA驱动).zip

    这极大地简化了开发流程,因为无需从零开始编写所有底层驱动代码。 最后,为了测试驱动,我们需要编写一个简单的应用,它可以发送和接收UDP数据包。这个应用可以基于socket API,创建一个UDP套接字,然后通过FPGA...

    时序逻辑电路的设计.pdf

    状态表的简化是时序逻辑电路设计的重要步骤之一。状态化简的目的是消去多余状态,得到最简的状态表。在状态化简时,需要判断两个状态是否等价。如果两个状态等价,那么它们可以合并为一个状态。 状态化简的方法有...

    QTP复杂脚本

    在QTP中,复杂脚本通常指的是包含多个逻辑判断、循环结构、异常处理和自定义函数的脚本。这些脚本能够处理更复杂的业务逻辑,提高测试的覆盖率和效率。下面将详细介绍QTP复杂脚本的关键知识点: 1. **对象库与对象...

    收集的过滤驱动加密源码

    给定的部分代码展示了如何在一个过滤驱动中实现加密逻辑。具体来说,`SfRead`函数和`SfWrite`函数分别处理读取和写入操作。这些函数首先检查当前请求是否涉及加密文件,如果是,则执行特定的加密处理,如果不是,则...

    嵌入式Linux驱动程序开发

    - **查询方式**:驱动程序不断检查设备的状态寄存器以判断是否可以进行数据传输。这种方式简单但效率较低,因为它会导致CPU空闲等待。 - **中断方式**:设备完成数据传输后向CPU发送中断信号,CPU响应中断后继续数据...

    I2C设备与驱动的关联

    通过上述分析,我们可以看到,在Linux内核中,I2C设备与驱动的关联是一个动态且复杂的过程,涉及到了设备的注册、匹配、初始化和移除等多个步骤。平台驱动模型的设计,极大地简化了驱动开发的难度,使得驱动程序能够...

    数字逻辑练习题与答案

    2. 真值表、逻辑图、逻辑表达式是描述逻辑函数的三种主要方式,各有优势。 #### 二、填空题解析 - 逻辑运算符的运算规则是理解逻辑代数的关键,如代入规则、对偶规则、反演规则等,帮助我们理解和简化逻辑表达式。 ...

    多变量的复杂计算器

    使用如Qt、wxPython或JavaFX等库可以简化UI开发。 3. **事件驱动编程**:当用户更改输入时,计算器需要实时更新结果。这涉及监听UI元素的事件,如值改变,然后触发相应的计算函数。事件驱动编程模型在这种情况下...

    STM32H750驱动触摸屏(10.1寸,1280X800分辨率)【支持STM32H7系列单片机,HAL库驱动】.zip

    1. **HAL库**:STM32的HAL库是意法半导体提供的高级抽象层库,简化了硬件驱动的编程,使得开发者可以更专注于应用逻辑,而不是底层硬件细节。 2. **HAL库驱动LCD**:通过HAL库的函数接口,可以方便地配置LTDC,设置...

    化工仪表及自动化全套课件.ppt

    - 可以通过软件编程实现复杂的控制逻辑,简化硬件设计。 2. **记忆功能**: - 微处理器的加入使得仪表能够长时间保存状态信息,即使断电也能保留数据。 - 可以同时记录和处理多个状态信息,提供更强大的数据处理...

    电子技术基础第三章 组合逻辑电路的分析和设计数字部分共64

    组合逻辑电路由各种基本逻辑门元件构成,这些门电路如AND(与)、OR(或)、NOT(非)、NAND(与非)、NOR(或非)和XOR(异或)等,通过不同方式连接,可以实现任意复杂的逻辑函数。电路的输出仅取决于各个输入信号...

Global site tag (gtag.js) - Google Analytics