需求

想给系统实现一个选择不同页面的功能,一开始的代码逻辑比较混乱,后来抽象出来就比较清楚了。第一步,咱们先说需求:

page_navagation

问题定义

我们希望实现一个页面切换,每次显示的可选的页码长度都是固定的,比如从第 1 页到第 11 页,从 21 页 到 31 页。这样能够实现一个统一的切换效果,可能还需要考虑一些边界情况。现在,我们令总页码数为 pages,当前选择的页码为 p,p 往左走或者往右走的步长是固定的,令步长为 step。那么我们现在要做的事情可以这么理解,我们要从 1 到 pages 之间截取可用的页码数,假设开始页码为 startIndex,结束页码为 endIndex。抽象一下,我们可以总结出以下几种情况:

Condition1

startIndex < 1 && endIndex <= pages

condition1.png

Condition2

startIndex >= 1 && endIndex > pages

condition2.png

Condition3

startIndex < 1 && endIndex > pages

condition3.png

Condition4

startIndex >= 1 && endIndex <= pages

condition4.png

这样抽象成四种情况,这样就比较容易理解。以线段的方式来理解,则是从 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 或者扫描二维码关注公众号:

93cfyj.jpg