Perl と Mojo::UserAgent で Web スクレイパーを作り、サイトが増えるたびにコピペで膨らむコードを、Moo の継承で1つの設計にまとめていく全10回の連載です。最後の回で、作ってきた設計が GoF の Template Method パターンだったことを確かめます。
1本のコードを第1回から少しずつ育てていく連載なので、基本は第1回から順に読む作りです。ただし、どこで困っているかによって入口を変えられます。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。
対象は、Perl の基本文法が分かり、Moo でクラスを書いたことがある方です。Moo が初めてなら、先に「関連シリーズ」の「Mooで覚えるオブジェクト指向プログラミング」をどうぞ。実行には Perl v5.36 以降、Moo、Mojolicious(Mojo::UserAgent・Mojo::DOM)を使います。
どこから読むか
- 第1回 — スクレイピングを初めて書くなら。HTML の取得と CSS セレクタでの抽出、アクセスのマナーまでを押さえる回
- 第4回 — 継承は書けるが、処理の流れをどこに置くかで迷っているなら。基底クラスに流れを1つだけ持たせる回。第2〜3回のコピペと関数化の行き詰まりが前提なので、ざっと目を通してから
- 第10回 — Template Method パターンの名前と Strategy との違いだけを知りたいなら。前の回のコードを引きながら整理する回
困りごとから探す
似たスクリプトをコピペで増やしている
継承したのに、子クラスに書くことが多い
足したら壊れる・壊れても気づかない
全話一覧
- 第1回 Webページの見出しをPerlで抜き出したい。取得してCSSセレクタで拾う【Mojo::UserAgent】
- 第2回 スクレイパーをコピペで2本に増やしたら、直す場所が2倍になり直し漏れが残る【コピペの限界】
- 第3回 関数に切り出しても、保存方法を変えるたびに手が入る。共通の手順を洗い出す【関数化】
- 第4回 処理の順番をスクリプトごとに書いている。流れを基底クラスに1つだけ持たせる【抽象メソッド】
- 第5回 サイトごとに違う抽出処理だけを書き分けたい。子クラスで上書きする【継承とオーバーライド】
- 第6回 保存処理を子クラスごとに毎回書かされる。既定の動きを親に置き、必要な所だけ変える【フックメソッド】
- 第7回 サイトの構造が変わると、空のデータを黙って保存してしまう。検証を差し込む口を作る【フックメソッド】
- 第8回 サイトを1つ足すたびに既存クラスを直したくない。新しいクラスを足すだけで済ませる【開放閉鎖原則】
- 第9回 3サイト分のスクレイパーを一括で動かす。次の変更が1か所で済むかを確かめる【継承による設計】
- 第10回 流れは親が握り、違いだけを子が書く。この設計の名前とStrategyとの違い【Template Method】
