需求描述:
有一个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
我们可以该代码段的复杂度有多高,同时还存在几个很大的缺点:
- 严格来说,逻辑法并不能很好的完成需求中提出的功能。它只能在知道类别数目的情况下完成功能。
- 代码灵活性极差,根本无法扩展。当需要增加一个类别,或者某个类别的参数做调整时,将无法完成功能。
- 代码复杂度极高,执行效率相当低,包括多重循环和多个条件判断。
- 面向对象方法处理:
此方法主要抽象出一个物品类别基类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:至于表中的存储相关,我想用数据库会是一个相当不错的选择了。