1 回答
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
}
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报