• 【原创】表驱动法的使用举例及优越性体现


    需求描述:

    有一个CSV文件,其中包含很多的物品信息,这些物品分为很多的类别,然而每个类别的物品的信息也不一样,唯一相同的就是每个物品都有一个与物品类别关联的类别ID,而每个物品信息的格式也不一定相同。如下图所示:

     

    可能还包括内存、CPU、光驱等等一些其他类型的物品,每种物品的参数信息都不一样。我们需要对这些物品做统一处理,该怎么解决呢?倘若我们现在只是对这些物品信息作输出和打印。

    编码处理:

    • 我们先来逻辑法如何处理:

      此方法必须知道物品共有多少个类别,以及每个类别的详细参数数目及参数的类型。

      While 物品 in CSV文件

             If  物品类别is 显示器 Then

                       While 参数 in 显示器参数

                                If  参数类型 is  String

                                         按String方式 Print 参数信息

                                Else If 参数类型 is Uint

                                         按Uint方式 Print 参数信息

                                ……

                                Else if 参数类型 is Bool

                                         按Bool方式 Print 参数信息

                       End

             ……

             Else If 物品类别 is 硬盘 Then

                       While 参数 in 硬盘参数

                                If  参数类型 is  String

                                         按String方式 Print 参数信息

                                ……

                                Else If 参数类型 is Int

                                         按Int方式 Print 参数信息

                       End

             End If

      End

      我们可以该代码段的复杂度有多高,同时还存在几个很大的缺点:

    1. 严格来说,逻辑法并不能很好的完成需求中提出的功能。它只能在知道类别数目的情况下完成功能。
    2. 代码灵活性极差,根本无法扩展。当需要增加一个类别,或者某个类别的参数做调整时,将无法完成功能。
    3. 代码复杂度极高,执行效率相当低,包括多重循环和多个条件判断。
    • 面向对象方法处理:

      此方法主要抽象出一个物品类别基类GoodsType,然后让所有的物品类别去实现GoodsType类,假设有20个物品类别,需要编写20个物品类别类,当有新的物品类别时,只需要新增一个物品类别类去实现GoodsType类,然后再在IF语句中(符号※处)新增对该类别的判断。

      While 物品 in CSV文件

             If 物品类别 is 显示器 Then

                       Call 显示器子类处理程序

             ……

             ElseIf 物品类别 is 硬盘 Then

                       Call 硬盘子类处理程序

             ※

      End

      这种方法初看上去似乎代码复杂度不是很高,精减了不少。其实它的实质并没有变,只是将打印过程的代码分开放到各个不同的子类文件中而已。代码的灵活性和可扩展性依然很差,执行效率也仍然很低下。

    • 表驱动法处理:

      在表驱动法中,我们这样来处理:我们把不同物品类别的参数放到不同的表中存储,然后再对每个物品进行处理时,很容易通过索引找到该物品对应类别的参数,再去调用该类别的参数进行打印。

      While 物品 in CSV文件

             Get 物品参数 Through 索引物品类别

             Call 打印处理程序 with 物品参数

      End

      打印处理程序中只需要对所有的参数类型区分打印就行了,如下:

      PrintProgram 物品参数列表

            While 物品参数 in 物品参数列表

                       Switch  参数类型

                                Case String:按String方式 Print 参数信息

                                Case Uint:按Uint方式 Print 参数信息

                                Case Int:按Int方式 Print 参数信息

                                Case Bool:按Bool方式 Print 参数信息

             End

      End Program

      在这里可以列举所有的参数类型,而参数类型变动的可能性比较小,这样就可以做到很灵活了,扩展性也相当好。当增加新类别时,只需要增加一个表存储物品类别参数就行了。而不需要涉及到代码的更改。在这里还可以进行优化,具体怎么实施,就留给你去考虑了。

      PS:至于表中的存储相关,我想用数据库会是一个相当不错的选择了。

  • 相关阅读:
    线程池源码解析
    String与常量池
    spring循环依赖
    ConcurrentHashMap源码解析(JDK8)
    原子类源码分析
    web service和ejb的区别
    RPC
    hashcode()和equals()的区别
    关于json
    Lifecycle of jsf
  • 原文地址:https://www.cnblogs.com/zwffff/p/1717954.html
Copyright © 2020-2023  润新知