需求
想给系统实现一个选择不同页面的功能,一开始的代码逻辑比较混乱,后来抽象出来就比较清楚了。第一步,咱们先给最终效果:
问题定义
我们希望实现一个页码切换,每次显示的可选的页码列表长度都是固定的,比如从第 1 页到第 11 页,从 21 页 到 31 页。这样能够实现一个统一的切换效果,可能还需要考虑一些边界情况。现在,我们令总页码数为 pages
,当前选择的页码为 p
, p
往左走或者往右走的步长是固定的,令步长为 step
。那么我们现在要做的事情可以这么理解,我们要从 1 到 pages
之间截取可用的页码数,假设开始页码为 startIndex
,结束页码为 endIndex
。抽象一下,我们可以总结出以下几种情况:
Condition1
startIndex<1&&endIndex<=pages
Condition2
startIndex>=1&&endIndex>pages
Condition3
startIndex<1&&endIndex>pages
Condition4
startIndex>=1&&endIndex<=pages
这样抽象成四种情况,这样就比较容易理解。以线段的方式来理解,则是从 1 到 pages
截取页码。
代码实现
Show me the code.
func GetPageList(p, step, pages int) ([]int) {
pageList := make([]int, 0)
startIndex := p - step
endIndex := p + step
if startIndex < 1 && endIndex <= pages {
startIndex = 1
endIndex = startIndex + 2 * step
} else if startIndex >= 1 && endIndex > pages {
endIndex = pages
startIndex = pages - 2 * step
} else if startIndex < 1 && endIndex > pages {
startIndex = 1
endIndex = pages
}
// handle some special cases
if startIndex < 1 {
startIndex = 1
}
if endIndex > pages {
endIndex = pages
}
for i := startIndex; i <= endIndex; i++ {
pageList = append(pageList, i)
}
return pageList
}
结语
没有思考清楚的时候,你的逻辑是混乱的,写出来的代码也是混乱的。所以先整理好思路,想好应该怎么写,可以画画图,理理思路,这样写出的代码既有逻辑出现 bug 的概率也会大大降低。另外一点,很多人觉得写业务和算法可能就相去甚远,都有时候认真想想,或许你的业务代码也可以抽象成一个小算法。
以上。
欢迎搜索微信号 mad_coder 或者扫描二维码关注公众号: