Perl と Moo で蔵書を管理する本棚アプリを作り、本棚の中身(配列)を使う側に見せずに、本を1冊ずつ取り出す仕組みを組み立てていく全5回の連載です。Book と BookShelf の2クラスから始め、for ループでカプセル化が崩れるのを確かめ、Moo::Role で走査の約束を決め、本棚に iterator() を持たせます。第5回で、作ってきたものが Iterator パターンだと名前を付け、逆順の巡回を足します。
各回は前の回のコードに手を入れていく作りなので、通して読むなら第1回からが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。
対象は、Moo の has でクラスを書いたことがある方です。コードは Perl v5.36 以降(サブルーチンシグネチャ)で書いています。Moo が初めてなら、先に前シリーズ「Mooで覚えるオブジェクト指向プログラミング」の目次(このページの最後にリンクがあります)から読んでください。
どこから読むか
- 第1回 — 複数のオブジェクトをまとめて持つクラスを書いたことがないなら。Book と BookShelf を作り、第2回でその本棚を全冊表示して問題を見つける
- 第2回 —
$obj->items->@*のように中身の配列を直接回していて、それの何がまずいのか知りたいなら。第3回・第4回で直していく - 第3回 —
has_nextとnextで回すイテレータを自分で書いてみたいなら。第4回で本棚から取り出せるようにする - 第5回 — Iterator パターンの全体像から入りたいなら。4つの役割と本棚アプリのクラスの対応を先に見られる
困りごとから探す
オブジェクトを何個もまとめて扱う置き場がない
- 第1回 — 本の追加・取り出し・冊数を、1つのクラスに任せたい
使う側のループが、集合体の中身の作りを知っている
順に取り出す手順を、使う側から追い出したい
走査クラスの名前に、使う側が縛られている
- 第4回 —
BookShelfIterator->new(...)と書かないと回せない
順番を変えて回したい・作ったものを説明できない
全話一覧
- 第1回 何冊もの本を、配列のまま持ち歩かない。MooでBookとBookShelfの2クラスに分けて作る【集合体】
- 第2回 本棚の配列をforで直接回すと、中身の作りを変えたとき呼び出し側をすべて直すことになる。番号で取り出しても残る依存を確かめる【カプセル化】
- 第3回 インデックスを数えるループが、本棚を使う所ごとに増えていく。has_nextとnextだけの専用クラスに任せる【イテレータ】
- 第4回 走査クラスを差し替えると、呼び出し側のnewまで直すことになる。本棚にiterator()を持たせて生成を任せる【iterator()メソッド】
- 第5回 作ってきた本棚の巡回は、Iteratorパターンそのものだった。ループを変えずに逆順で回す【Iteratorパターン】
