查表法和switch的能力有很大重合,两者都可通过“索引”找到指定元素,但它们有哪些区别呢?在不同场景下我们应如何选择?
介绍
switch
switch使用广泛,在Go设计模式(7)-工厂模式中便有体现。
/**
* @Description: 简单工厂
*/
type SimpleParseFactory struct {
}
func (simple *SimpleParseFactory) create(ext string) ConfigParse {
switch ext {
case "json":
return &JsonConfigParse{}
case "yaml":
return &YamlConfigParse{}
}
return nil
}
查表法
“查表法”将事先确定好的内容存放到map中,根据需要从map中获取。Go设计模式(20)-策略模式中使用”查表法“进行实现。
/**
* @Author: Jason Pang
* @Description: 税费计算函数,金额都为分
* @param price
* @param qty
* @return taxPrice
*/
type TaxComputeFunc func(price int64, qty int64) (taxPrice int64)
/**
* @Author: Jason Pang
* @Description: 税费计算策略存储处
0为不含税 1为含税
*/
var TaxComputeFuncMap = map[int]map[string]TaxComputeFunc{
0: map[string]TaxComputeFunc{
Common: common,
Win: win,
},
1: map[string]TaxComputeFunc{
Common: common,
Win: win,
},
}
区别
之所以能发现两者区别,是因为有块逻辑最初我用switch实现,但后面有同学改为查表法。当时没有察觉有什么区别就同意了。最近需求更改需要修改这块逻辑,发现使用查表法有问题,switch是更好的方案。
大家之所以喜欢用查表法,应该是感觉能够去掉if-else、switch。
但switch有查表法没有的能力,它有default。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
举个例子方便大家理解:
-
如果有3个命令,对应的函数分别是funcA、funcB、funcC,这种情况下,使用switch或查表法都可以。
-
如果有10个命令,命令A和命令B对应的函数为funcA、funcB,其它8个命令对应funcC,这种情况下,使用查表法就很被动,虽然能够实现,但很丑。
所有如果有大量case指向同一个逻辑,推荐使用switch,否则两者皆可。
总结
如果对事物没有深入的理解,遇到选择的时候会不知所措。所以一定要多经历、多思考、多总结。