if-else过多的冗余代码优化思路

原创 奔跑的小梁 梁霖编程工具库 2022-12-07 10:26 发表于北京

收录于合集

#编程tips1个

#设计模式8个

需求:假设有若干种报警需求,针对这些不同的报警需求我们需要将对应的output和params序列化为不同的结果,比如报警需求A需要序列化为结果A,报警需求B需要序列化为结果B等等,我们的直接解决思路是通过if-else进行判断,但这会导致代码冗余,不利于后续的扩展[即新增一种报警规则会导致需要修改的地方不明确或比较多],可以考虑接口+实现+选择器的方式进行解耦。

直接if-else代码:代码冗余度高,且不利于扩展

// 格式化报警详情func formatOutput(output, monitor string) string {  lines := ""  if monitor == models.LargeMeasureMonitorName {    // 突发大用量报警详情    list := models.LargeMeasureAlarmDataList{}    json.Unmarshal([]byte(output), &list)    for _, v := range list {      line := fmt.Sprintf("监控时间:%v - %v,计费项编号:%v,实例ID:%v,大于 %v %v;", v.BeginTime, v.EndTime, v.ChargeItemCode, v.InstanceNo, v.Threshold, v.OriginalMeasureUnit)      if lines == "" {        lines += line      } else {        lines = lines + "\n" + line      }    }  } else if monitor == models.LargeChargeAmountMonitorName {    // 突发金额大波动报警详情    list := models.LargeAmountAlarmDataList{}    json.Unmarshal([]byte(output), &list)    for _, v := range list {      line := ""      line = fmt.Sprintf("监控时间:%v - %v,计费详单:%v,原价%v 大于 %v元, 折后价%v 大于 %v元;",        v.BeginTime, v.EndTime, v.ChargeID, v.OriginalBillAmount, v.Threshold, v.OrigDiscountBillAmount, v.Threshold)      if lines == "" {        lines += line      } else {        lines = lines + "\n" + line      }    }  } else if monitor == models.ChargeCreateDelayMonitorName {    // 计费出账延迟    list := models.BatchJobAlarmDataList{}    json.Unmarshal([]byte(output), &list)    for _, v := range list {      // 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 计费单号: xxx,生成时间大于 xx 小时      line := fmt.Sprintf("监控时间 %v - %v, 计费单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)      if lines == "" {        lines += line      } else {        lines = lines + "\n" + line      }    }  } else if monitor == models.BillCreateDelayMonitorName {    // 账处出账延迟    list := models.BatchJobAlarmDataList{}    json.Unmarshal([]byte(output), &list)    for _, v := range list {      // 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 结算单号: xxx,生成时间大于 xx 小时      line := fmt.Sprintf("监控时间 %v - %v, 结算单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)      if lines == "" {        lines += line      } else {        lines = lines + "\n" + line      }    }  } else if monitor == models.MeasureNotCallBackMonitorName {    //没有回调    list := models.MeasureNotCallBackAlarmDataList{}    json.Unmarshal([]byte(output), &list)    for _, v := range list {      line := fmt.Sprintf("监控时间 %v - %v, 商品:%v 没有回调", v.BeginTime, v.EndTime, v.Product)      if lines == "" {        lines += line      } else {        lines = lines + "\n" + line      }    }  }
  return lines}

优化代码:通过接口+实现+选择器的方式进行解耦

// 定义接口type AlarmCommonFormat interface {  formatParams(params string) (string, error)  formatOutput(output string) (string, error)}
// 突发大用量格式化type LargeMeasureFormat struct {}
func (lmf *LargeMeasureFormat) formatParams(params string) (string, error) {  lines := ""  // 突发大用量  list := models.HeavyUsageRuleList{}  err := json.Unmarshal([]byte(params), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := fmt.Sprintf("计费项编号 %v %v %v%v;", v.ChargeItemCode, compareStyleMap[v.CompareStyle], v.Threshold, v.OriginalMeasureUnit)    if lines == "" {      lines = lines + line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
func (lmf *LargeMeasureFormat) formatOutput(output string) (string, error) {  lines := ""  list := models.LargeMeasureAlarmDataList{}  err := json.Unmarshal([]byte(output), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := fmt.Sprintf("监控时间:%v - %v,计费项编号:%v,实例ID:%v,大于 %v %v;", v.BeginTime, v.EndTime, v.ChargeItemCode, v.InstanceNo, v.Threshold, v.OriginalMeasureUnit)    if lines == "" {      lines += line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
//突发金额大波动格式化type LargeChargeAmountFormat struct {}
func (lcaf *LargeChargeAmountFormat) formatParams(params string) (string, error) {  lines := ""  // 突发计费金额大波动  list := models.HeavyAmountRuleList{}  err := json.Unmarshal([]byte(params), &list)  if err != nil {    return "", err  }  for _, v := range list {    // 原价 大于 100元 / 折后价 大于 100元    line := fmt.Sprintf("%v %v %v元;", billAmountMap[v.Amount], compareStyleMap[v.CompareStyle], v.Threshold.StringFixed(6))    if lines == "" {      lines = lines + line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
func (lcaf *LargeChargeAmountFormat) formatOutput(output string) (string, error) {  lines := ""  list := models.LargeAmountAlarmDataList{}  err := json.Unmarshal([]byte(output), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := ""    line = fmt.Sprintf("监控时间:%v - %v,计费详单:%v,原价%v 大于 %v元, 折后价%v 大于 %v元;",      v.BeginTime, v.EndTime, v.ChargeID, v.OriginalBillAmount, v.Threshold, v.OrigDiscountBillAmount, v.Threshold)    if lines == "" {      lines += line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
//计费出账延迟格式化type ChargeCreateDelayFormat struct {}
func (ccdf *ChargeCreateDelayFormat) formatParams(params string) (string, error) {  lines := ""  //   计费出账延迟  list := models.DelayedRuleList{}  err := json.Unmarshal([]byte(params), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := fmt.Sprintf("大于 %v 小时;", v.DdlTime)    if lines == "" {      lines = lines + line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
func (ccdf *ChargeCreateDelayFormat) formatOutput(output string) (string, error) {  lines := ""  // 计费出账延迟  list := models.BatchJobAlarmDataList{}  err := json.Unmarshal([]byte(output), &list)  if err != nil {    return "", err  }  for _, v := range list {    // 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 计费单号: xxx,生成时间大于 xx 小时    line := fmt.Sprintf("监控时间 %v - %v, 计费单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)    if lines == "" {      lines += line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
//账处出账延迟格式化type BillCreateDelayFormat struct {}
func (bcdf *BillCreateDelayFormat) formatParams(params string) (string, error) {  lines := ""  //   账处出账延迟  list := models.DelayedRuleList{}  err := json.Unmarshal([]byte(params), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := fmt.Sprintf("大于 %v 小时;", v.DdlTime)    if lines == "" {      lines = lines + line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
func (bcdf *BillCreateDelayFormat) formatOutput(output string) (string, error) {  lines := ""  // 账处出账延迟  list := models.BatchJobAlarmDataList{}  err := json.Unmarshal([]byte(output), &list)  if err != nil {    return "", nil  }  for _, v := range list {    // 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 结算单号: xxx,生成时间大于 xx 小时    line := fmt.Sprintf("监控时间 %v - %v, 结算单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)    if lines == "" {      lines += line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
// 推量未回调格式化type MeasureNotCallBackFormat struct {}
// 推量未回调没有规则参数的格式化func (mncbf *MeasureNotCallBackFormat) formatParams(params string) (string, error) {  return "", nil}
func (bcdf *MeasureNotCallBackFormat) formatOutput(output string) (string, error) {  lines := ""  //没有回调  list := models.MeasureNotCallBackAlarmDataList{}  err := json.Unmarshal([]byte(output), &list)  if err != nil {    return "", err  }  for _, v := range list {    line := fmt.Sprintf("监控时间 %v - %v, 商品:%v 没有回调", v.BeginTime, v.EndTime, v.Product)    if lines == "" {      lines += line    } else {      lines = lines + "\n" + line    }  }  return lines, nil}
// 选择方法func GetAlarmCommonFormat(monitorName string) AlarmCommonFormat {  var acf AlarmCommonFormat = nil  switch monitorName {  case models.LargeMeasureMonitorName:    acf = &LargeMeasureFormat{}  case models.LargeChargeAmountMonitorName:    acf = &LargeChargeAmountFormat{}  case models.ChargeCreateDelayMonitorName:    acf = &ChargeCreateDelayFormat{}  case models.BillCreateDelayMonitorName:    acf = &BillCreateDelayFormat{}  case models.MeasureNotCallBackMonitorName:    acf = &MeasureNotCallBackFormat{}  }  return acf}

vip永久刷题群双十二优惠价~

奔跑的小梁,公众号:梁霖编程工具库leetcode刷题直播教学,手把手带你刷题,双十二价格优惠通知

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值