実行時にCSV→JSON→YAMLと出力形式を切り替えたい。is => 'rw'を活用した動的なオブジェクト切り替えの実装方法を解説します。
エクスポーターを一元管理するクラスが欲しい。Contextパターンの考え方でDataExporterクラスを作成し、処理の委譲を学びます。
複数のエクスポータークラスに共通ルールを設けたい。Moo::Roleのrequiresでインターフェースを定義し、統一的なAPI設計を実現します。
複雑なif/elseをスッキリさせたい!CSV出力を専用クラスに分離して、責務分離の考え方とMooでのクラス設計を学びます。
YAMLやXML形式も追加したらコードが複雑に…。if/elseが肥大化する問題を体感し、なぜリファクタリングが必要なのかを理解します。
アドレス帳データをCSVやJSONで保存したい。if/elseで形式を切り替えるシンプルな実装から始めて、Mooを使ったデータエクスポーターの基礎を学びます。
PerlとMooでテキストエディタを作りながらCommandパターンを学ぶ全10回のシリーズ記事です。Undo/Redo機能を実装し、デザインパターンの考え方を身につけます。
完成したエディタの設計が、GoFのCommandパターンだったことを明かします。パターンの構造と応用例を解説し、シリーズ全体を振り返ります。
これまで作成したEditor、コマンドクラス、History、MacroCommandを統合し、対話的に操作できるCLIベースの簡易テキストエディタを完成させます。
複数の操作を1つにまとめるMacroCommandクラスを実装します。Compositeパターンを活用し、複数操作の一括実行と一括Undoを実現します。
Historyクラスにredoメソッドを実装し、Undoした操作をやり直せるようにします。undo_stackとredo_stack間のコマンド移動を理解し、Undo/Redoの連続操作をマスターします。
操作履歴を管理するHistoryクラスを作成します。undo_stackとredo_stackでスタック管理を行い、execute_commandとundoメソッドを実装。履歴管理のカプセル化を学びます。
InsertCommandとDeleteCommandに共通のインターフェースを保証するため、Moo::Roleでrequiresを使ったCommand::Roleを作成します。コンパイル時に不足メソッドを検出できる安全な設計を学びます。
各操作に「逆操作」を定義してUndo機能を実現します。InsertCommandにundoメソッドを追加し、挿入の逆である削除を実装。DeleteCommandクラスも作成します。
「何をしたか」を記録するために、操作そのものをオブジェクトにするアイデア。InsertCommandクラスを作成し、操作のオブジェクト化を学びます。