Calculate pagination

ページネーション

課題

とある在庫管理システムの一覧画面では、在庫を 1 ページに 100 件表示しています。 その際、以下の項目を合わせて表示します。

  • 在庫は全部で何件あるか
  • 全部で何ページあるのか
  • 現在、何ページ目か
  • 現在、何件目から何件目を表示しているか

そこで、在庫の件数が与えられたときに全部で何ページあるかを返す関数を作成してください。 なお、関数名は getPageCount あるいは get_page_count とし、引数は整数が 1 つ、返り値は整数が 1 つであるとします。

アプローチ案

在庫 n 件なら何ページ?

具体例で考えさせる。

  • 在庫が 5 件あったら全部で何ページある?
  • 在庫が 300 件あったら全部で何ページある?

それに対する答え(1 ページ、3 ページ)などに対して、その数字はどうやって出したのかを考えさせる。

想定解

  • 100 で割る -> 5 件の時に説明がつかない。100 で割れないときはどうするの?という問いかけをして場合分けさせる方向性が有効か。
if stock_num % 100 == 0:
    # code...
else:
    # code...

n ページになる場合の在庫件数で考えられるのは?

このアプローチはおすすめしない。なぜかというと、if 文を永遠に書き続けるアプローチになりかねないから。

具体例としては次のようなものがある。

  • 全部で 1 ページになる場合の在庫で考えられるのは?
  • 全部で 3 ページになる場合の在庫で考えられるのは?

1 から 100 件、201 件から 300 件など、答えは出てくるものの、それをコードで表そうとすると以下のようになる。

if stock_num >= 1 and stock_num <= 100:
    return 1
elif stock_num >= 201 and stock_num <= 300:
    return 3

以後、別のパターンを考えて elif を増やす方向でしか物事を考えられなくなり、永遠に実装が終わらない。

これを解決するには、201 から 300 の数字に共通点を見つけさせる方向に持っていかなければならず、問題がさらに難しくなる。

解決案としては 1 を引くと 100 の位が同じになる点に着目。(これを教えてしまうとアルゴリズムの勉強にならないのだが)

s = stock_num - 1
return s // 100