现在我有一个大型程序,它有一组非常大的模型用于不同类型的项目。每个案例设置所述项目的属性,然后我们使用它。
例如:
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语句相比的处理成本。 有任何想法吗?或者我应该按原样离开怪物?
谢谢你们。
答案 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,
嗯,这看起来是一个更好的解决方案。我同意,这不一定是低效率,而是困扰我的维持。随着我们为我们的软件添加更多模型,该列表不断增长。我肯定会查阅这本书并给它一个机会。我同意,我们确实需要减少比较。
谢谢! ķ