1 回答

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
在不了解更多周圍代碼的情況下,很難簡(jiǎn)化整個(gè)事情并為您提供完成的代碼。
但是我有幾個(gè)建議給你,我認(rèn)為你可以應(yīng)用這些建議來(lái)簡(jiǎn)化你自己的邏輯。
建議 #1
我在這里看到的一個(gè)問(wèn)題是使邏輯更加混亂,這是int輸入變量(偏移量、限制、頁(yè)面、頭部、最后)的基本類型()的使用。
問(wèn)題是您正在將輸入變量與默認(rèn)值(在 Go 中稱為“零值”)進(jìn)行比較,例如 0,或者defaultLimit您實(shí)際嘗試檢查的是用戶是否提供了這些輸入。
我的建議是使這些輸入變量指針 ( *int),以便您可以將它們與它們進(jìn)行比較,nil以便更輕松、更清楚地檢查用戶是否發(fā)送了這些輸入。我認(rèn)為這將使邏輯更具可讀性。
例如,offset & limit 你可以簡(jiǎn)化成這樣的:
if offset != nil {
opt.SetSkip(*offset)
}
if limit != nil {
opt.SetLimit(*limit)
}
建議#2
我還建議以不同的方式處理錯(cuò)誤。
首先檢查錯(cuò)誤情況。如果輸入無(wú)效,則返回錯(cuò)誤。
如果沒(méi)有錯(cuò)誤,然后處理成功案例。這是用 Golang(以及其他語(yǔ)言)編寫(xiě)代碼的一種非常常見(jiàn)的方式。
像這樣的東西:
// 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 關(guān)注
- 110 瀏覽
添加回答
舉報(bào)