特大型VB案例陈述

时间:2014-01-07 15:29:53

标签: switch-statement case

现在我有一个大型程序,它有一组非常大的模型用于不同类型的项目。每个案例设置所述项目的属性,然后我们使用它。

例如:

Select Case Animal
Case "Dalamatian", "Collie","Lab"
 .Legs = 4
 .Ears = "Floppy"
 .FurIsFuzzy = True
Case "Elephant"
.Legs = 4
.HasTrunk = True
.HasTusks = True
Case "Panda", "Polar" 
.IsBear = True

你明白了。所有型号都有不同的属性,不同的值。我继承的代码有 2,000 模型(大约100多个案例!)。这非常低效。从这里的档案中我已经注意到一些类似的问题,通过制作方法词典或可能的多态性来做到这一点。对于这个问题,VB.net还有其他任何可能的建议吗?我可能正在考虑一个查找表,但我不知道与case / switch语句相比的处理成本。  有任何想法吗?或者我应该按原样离开怪物?

谢谢你们。

2 个答案:

答案 0 :(得分:0)

如果您还没有阅读重构模式,我强烈推荐它。这听起来像是使用Command模式的一个很好的例子,它基本上是方法词典的完成。

从可读性的角度来看,我建议先使用Extract Method。完成后,您可以使用共享字典替换case语句。像这样:

Public Shared commands As New Dictionary(Of String, Action(Of AnimalClass))()

' In your constructor
If commands.Count = 0 then
commands.Add("Dalmation",InitializeAsDog)
commands.Add("Collie",InitializeAsDog)
commands.Add("Lab",InitializeAsDog)
...
End If

' Replace case statement with this:

Dim callback as Action = commands.Item(Animal)
callback(instanceOfAnimal)

这为重构提供了O(1)效率,或者O(2000)初始化所有模型。将其与原始案例陈述进行对比,原始案例陈述需要对每个循环进行100次比较,大致相当于扫描数组直到找到匹配。这将大致为O(100)效率,或O(200000)来初始化所有模型。

答案 1 :(得分:0)

B2K,

嗯,这看起来是一个更好的解决方案。我同意,这不一定是低效率,而是困扰我的维持。随着我们为我们的软件添加更多模型,该列表不断增长。

我肯定会查阅这本书并给它一个机会。我同意,我们确实需要减少比较。

谢谢! ķ