查表法与switch有什么区别?

查表法和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:
        ...
}

举个例子方便大家理解:

  1. 如果有3个命令,对应的函数分别是funcA、funcB、funcC,这种情况下,使用switch或查表法都可以。

  2. 如果有10个命令,命令A和命令B对应的函数为funcA、funcB,其它8个命令对应funcC,这种情况下,使用查表法就很被动,虽然能够实现,但很丑。

所有如果有大量case指向同一个逻辑,推荐使用switch,否则两者皆可。

总结

如果对事物没有深入的理解,遇到选择的时候会不知所措。所以一定要多经历、多思考、多总结。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值