为了账号安全,请及时绑定邮箱和手机立即绑定

简化golang中if else的表达

简化golang中if else的表达

Go
潇潇雨雨 2022-10-24 15:05:26
我有头部、最后、页面、限制和偏移过滤器的逻辑模块。如 :../example/param 如果没有查询,返回所有值../example/param?limit=10 返回前 10 个值..example/param?offset=3 从数字 4 到 23 返回值(默认限制为 20)..example/param?limit=15&offset=2 返回值 3 到 17../example/param?page=2&limit=5 返回值 6 到 10../example/param?head=15 返回前 15 个值../example/param?last=15 返回最后 15 个值../example/param?head=8&last=4 返回错误../example/param?page=3&offset=4 返回错误../example/param?page=2&limit=5&offset=6 返回错误我有默认参数,如:var defaultPageParameter = PageParameter{Limit:  20,Offset: 0,Page: 1,Head: 0,Last: 0,}limit := pagePara.Limitoffset := pagePara.Offsetpage := pagePara.Pagehead := pagePara.Headlast := pagePara.LastdefaultPage := defaultPageParameter.PagedefaultLimit := defaultPageParameter.LimitdefaultOffset := defaultPageParameter.Offsetpaginate := (page*limit)-limitif else 我已经写了一些表达式,但是这段代码真的太多了,我想简化代码。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

在不了解更多周围代码的情况下,很难简化整个事情并为您提供完成的代码。


但是我有几个建议给你,我认为你可以应用这些建议来简化你自己的逻辑。


建议 #1

我在这里看到的一个问题是使逻辑更加混乱,这是int输入变量(偏移量、限制、页面、头部、最后)的基本类型()的使用。


问题是您正在将输入变量与默认值(在 Go 中称为“零值”)进行比较,例如 0,或者defaultLimit您实际尝试检查的是用户是否提供了这些输入。


我的建议是使这些输入变量指针 ( *int),以便您可以将它们与它们进行比较,nil以便更轻松、更清楚地检查用户是否发送了这些输入。我认为这将使逻辑更具可读性。


例如,offset & limit 你可以简化成这样的:


if offset != nil {

  opt.SetSkip(*offset)

}


if limit != nil {

  opt.SetLimit(*limit)

}

建议#2

我还建议以不同的方式处理错误。


首先检查错误情况。如果输入无效,则返回错误。


如果没有错误,然后处理成功案例。这是用 Golang(以及其他语言)编写代码的一种非常常见的方式。


像这样的东西:


// in the function from your post:


// check for error cases

err := checkError(offset, limit, page, head, last)

if err != nil {

  return make([]bson.M, 0), err

}


// handle success (non error) cases

if offset == defaultOffset && limit != defaultLimit && page == defaultPage {

    opt.SetLimit(limit)

    //if just limit

} else if // ... the rest of the success cases ...



// ... elsewhere in the same file (or package) ...


func checkError(offset, limit, page, head, last int) error {

  if offset != defaultOffset && limit != defaultLimit && page != defaultPage && head != 0 && last != 0{

      return errors.New("can't show all queries")

      //if there are all query

  } else if offset != defaultOffset && limit != defaultLimit && page != defaultPage {

      return errors.New("can't show all queries")

      //if there are all query

  } else if offset != defaultOffset && limit == defaultLimit && page != defaultPage{

      return errors.New("can't merge page and offset")

      //if combine page & offset

  } else if head != 0 && last != 0 {

      return errors.New("can't merge head and last")

      //if combine head & last

  } else if limit <=0 || page <= 0{

      return errors.New("BSON field value must be >= 0, actual value -20")

      //if limit & page value smaller than 0

  }


  return nil

}


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信