@nqounetです。
このシリーズでは、アドレス帳のデータを様々な形式(CSV、JSON、YAMLなど)で出力できる「データエクスポーター」を作っていきます。
最初はシンプルなif/elseによる実装から始めて、その問題点を体験しながら、少しずつ改良を加え、最終的にはStrategyパターンという設計パターンに到達します。
対象読者
- Perlの基本的な文法を理解している方
- オブジェクト指向プログラミングに興味がある方
- デザインパターンを実践的に学びたい方
シリーズ記事一覧
第1回-CSVとJSONでデータを保存しよう
if/elseで形式を切り替えるシンプルな実装から始めます。
第2回-新しい形式を追加すると大変!条件分岐の悩み
YAMLやXML形式を追加したらコードが複雑に…。if/elseが肥大化する問題を体感します。
第3回-出力処理を専用クラスに分けよう
CSV出力を専用クラスに分離して、責務分離の考え方とMooでのクラス設計を学びます。
第4回-Moo::Roleで共通の約束を決めよう
Moo::Roleのrequiresでインターフェースを定義し、統一的なAPI設計を実現します。
第5回-エクスポーターを管理するクラスを作ろう
Contextパターンの考え方でDataExporterクラスを作成し、処理の委譲を学びます。
第6回-実行時に出力形式を切り替えよう
is => 'rw'を活用した動的なオブジェクト切り替えの実装方法を解説します。
第7回-does制約でバグを防ごう
does制約を使った型チェックで、実行時エラーを未然に防ぐ方法を学びます。
第8回-形式名から自動でエクスポーターを選ぼう
Factoryパターン的なアプローチでオブジェクト生成を簡略化します。
第9回-完成!データエクスポーター
全機能を統合したデータエクスポーターの動作確認と、各形式での出力テストを行います。
第10回-これがStrategyパターンだ!
作ってきた設計がGoFデザインパターンの一つであることを明かし、SOLID原則との関係も解説します。
学べること
このシリーズを通じて、以下のことが学べます:
- Mooの基本的な使い方 - クラス定義、属性(has)、Moo::Role
- 責務分離 - 1つのクラスは1つのことだけを担当する
- インターフェース設計 - 共通の約束をRoleで定義する
- 型チェック - does制約で安全なコードを書く
- Strategyパターン - GoFデザインパターンの実践的な理解
- SOLID原則 - 特に開放/閉鎖原則(OCP)の適用
必要なモジュール
- Moo
- JSON::PP(コアモジュール)
- YAML::Tiny
| |
それでは、第1回から始めましょう!
