@nqounetです。
前回は、validate_dataフックメソッドを追加して、データ検証機能を実装しました。今回は、3つ目のスクレイパーを追加して、この設計の「拡張性」を検証します。
このシリーズについて
このシリーズは「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方を対象に、実践的なWebスクレイパーを作りながらオブジェクト指向設計を深く学ぶシリーズです。
シリーズ全体の目次は以下をご覧ください。
ECサイトの商品情報を取得したい
ニュースと天気予報のスクレイパーがうまく動いているので、今度はECサイトから商品情報を取得するスクレイパーも作りたくなりました。
まず、サンプルHTMLを作成します。
| |
ProductScraperを追加する
では、商品情報スクレイパーを作成しましょう。やることは簡単です。
WebScraperを継承するextract_dataをオーバーライドする- 必要なら
validate_dataやsave_dataもオーバーライドする
| |
たったこれだけで、新しいスクレイパーが完成しました!
実行してみる
| |
実行結果:
| |
期待通り動作しています!
注目すべきポイント:既存コードは一切変更していない
ここで非常に重要なポイントがあります。
WebScraper.pm、NewsScraper.pm、WeatherScraper.pmは、一切変更していません。
新しいProductScraper.pmというファイルを追加しただけで、新機能(商品情報スクレイピング)を追加できました。
classDiagram
class WebScraper {
+url
+scrape()
-_fetch_html()
+extract_data(dom)*
+validate_data(data)
+save_data(data)
}
class NewsScraper {
+extract_data(dom)
+validate_data(data)
}
class WeatherScraper {
+extract_data(dom)
+save_data(data)
}
class ProductScraper {
+extract_data(dom)
+validate_data(data)
+save_data(data)
}
WebScraper <|-- NewsScraper : extends
WebScraper <|-- WeatherScraper : extends
WebScraper <|-- ProductScraper : extends
note for ProductScraper "新規追加!"
これが「開放閉鎖原則(OCP)」
このような設計は、開放閉鎖原則(Open-Closed Principle, OCP)と呼ばれる重要な設計原則に従っています。
ソフトウェアの構成要素は、拡張に対して開いていて、修正に対して閉じているべきである
簡単に言えば、こういうことです。
- 拡張に対して開いている: 新しい機能(新しいスクレイパー)を追加できる
- 修正に対して閉じている: 既存のコード(WebScraperや他のスクレイパー)を修正しなくてよい
OCPのメリット
OCPに従った設計には、以下のメリットがあります。
- 既存機能が壊れない: 既存コードを触らないので、動作中の機能に影響を与えない
- テストが楽: 新しいクラスだけをテストすればよい
- 並行開発が可能: 他の人がWebScraperを使っていても、自分はProductScraperを追加できる
- 将来の拡張が予測可能: 新しいサイトを追加するときも、同じパターンで対応できる
OCPに違反していた最初のコード
シリーズの最初で作ったコピペアプローチを思い出してください。
| |
このアプローチでは、共通処理を修正したいときに全てのファイルを変更する必要がありました。つまり「修正に対して開いていた」のです。
今回のクラス継承アプローチでは、共通処理はWebScraperに集約されており、新しいスクレイパーを追加するときも、既存のスクレイパーを修正するときも、影響範囲が限定されています。
4つ目のスクレイパーも簡単
さらにスクレイパーを追加したくなっても、パターンは同じです。
| |
これだけで新しいスクレイパーが追加できます。
今回のまとめ
今回は以下のことを学びました。
- 既存コードを修正せずに新しいスクレイパー(ProductScraper)を追加できた
- これは「開放閉鎖原則(OCP)」に従った設計のおかげ
- OCPに従うと、拡張が容易で、既存機能に影響を与えない
次回予告
次回は、ここまで作成してきた全機能を統合して、完成したWebスクレイパーシステムの全体像を確認します。ニュース・天気・商品情報を一括で取得できるスクリプトを作成し、クラス設計の成果を確認しましょう。
お楽しみに!
