如何实现一个完美的页码跳转

202 阅读2分钟
原文链接: mp.weixin.qq.com

需求

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

问题定义

我们希望实现一个页码切换,每次显示的可选的页码列表长度都是固定的,比如从第 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.

  1. func GetPageList(p, step, pages int) ([]int) {

  2.    pageList := make([]int, 0)

  3.    startIndex := p - step

  4.    endIndex := p + step

  5.    if startIndex < 1 && endIndex <= pages {

  6.        startIndex = 1

  7.        endIndex = startIndex + 2 * step

  8.    } else if startIndex >= 1 && endIndex > pages {

  9.        endIndex = pages

  10.        startIndex = pages - 2 * step

  11.    } else if startIndex < 1 && endIndex > pages {

  12.        startIndex = 1

  13.        endIndex = pages

  14.    }

  15.    // handle some special cases

  16.    if startIndex < 1 {

  17.        startIndex = 1

  18.    }

  19.    if endIndex > pages {

  20.        endIndex = pages

  21.    }

  22.    for i := startIndex; i <= endIndex; i++ {

  23.        pageList = append(pageList, i)

  24.    }

  25.    return pageList

  26. }

结语

没有思考清楚的时候,你的逻辑是混乱的,写出来的代码也是混乱的。所以先整理好思路,想好应该怎么写,可以画画图,理理思路,这样写出的代码既有逻辑出现 bug 的概率也会大大降低。另外一点,很多人觉得写业务和算法可能就相去甚远,都有时候认真想想,或许你的业务代码也可以抽象成一个小算法。

以上。

欢迎搜索微信号 mad_coder 或者扫描二维码关注公众号: