简化golang中if else的表达

我有头部、最后、页面、限制和偏移过滤器的逻辑模块。

如 :

../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.Limit

offset := pagePara.Offset

page := pagePara.Page

head := pagePara.Head

last := pagePara.Last


defaultPage := defaultPageParameter.Page

defaultLimit := defaultPageParameter.Limit

defaultOffset := defaultPageParameter.Offset

paginate := (page*limit)-limit

if else 我已经写了一些表达式,但是这段代码真的太多了,我想简化代码。


潇潇雨雨
浏览 89回答 1
1回答

犯罪嫌疑人X

在不了解更多周围代码的情况下,很难简化整个事情并为您提供完成的代码。但是我有几个建议给你,我认为你可以应用这些建议来简化你自己的逻辑。建议 #1我在这里看到的一个问题是使逻辑更加混乱,这是int输入变量(偏移量、限制、页面、头部、最后)的基本类型()的使用。问题是您正在将输入变量与默认值(在 Go 中称为“零值”)进行比较,例如 0,或者defaultLimit您实际尝试检查的是用户是否提供了这些输入。我的建议是使这些输入变量指针 ( *int),以便您可以将它们与它们进行比较,nil以便更轻松、更清楚地检查用户是否发送了这些输入。我认为这将使逻辑更具可读性。例如,offset & limit 你可以简化成这样的:if offset != nil {&nbsp; opt.SetSkip(*offset)}if limit != nil {&nbsp; opt.SetLimit(*limit)}建议#2我还建议以不同的方式处理错误。首先检查错误情况。如果输入无效,则返回错误。如果没有错误,然后处理成功案例。这是用 Golang(以及其他语言)编写代码的一种非常常见的方式。像这样的东西:// in the function from your post:// check for error caseserr := checkError(offset, limit, page, head, last)if err != nil {&nbsp; return make([]bson.M, 0), err}// handle success (non error) casesif offset == defaultOffset && limit != defaultLimit && page == defaultPage {&nbsp; &nbsp; opt.SetLimit(limit)&nbsp; &nbsp; //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 {&nbsp; if offset != defaultOffset && limit != defaultLimit && page != defaultPage && head != 0 && last != 0{&nbsp; &nbsp; &nbsp; return errors.New("can't show all queries")&nbsp; &nbsp; &nbsp; //if there are all query&nbsp; } else if offset != defaultOffset && limit != defaultLimit && page != defaultPage {&nbsp; &nbsp; &nbsp; return errors.New("can't show all queries")&nbsp; &nbsp; &nbsp; //if there are all query&nbsp; } else if offset != defaultOffset && limit == defaultLimit && page != defaultPage{&nbsp; &nbsp; &nbsp; return errors.New("can't merge page and offset")&nbsp; &nbsp; &nbsp; //if combine page & offset&nbsp; } else if head != 0 && last != 0 {&nbsp; &nbsp; &nbsp; return errors.New("can't merge head and last")&nbsp; &nbsp; &nbsp; //if combine head & last&nbsp; } else if limit <=0 || page <= 0{&nbsp; &nbsp; &nbsp; return errors.New("BSON field value must be >= 0, actual value -20")&nbsp; &nbsp; &nbsp; //if limit & page value smaller than 0&nbsp; }&nbsp; return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go