@nqounetです。
前回までで、データエクスポーターの主要な機能がすべて揃いました。
今回は、YAML形式も追加して全機能を統合し、完成させましょう!
これまでに作った機能
- ExporterRole - エクスポーターが持つべきメソッドの約束
- CsvExporter - CSV形式で出力
- JsonExporter - JSON形式で出力
- DataExporter - エクスポーターを管理し、動的に切り替え可能
- exporter_for - 形式名からエクスポーターを自動選択
classDiagram
class ExporterRole {
<<Role>>
+export(data)* string
}
class CsvExporter {
+export(data) string
}
class JsonExporter {
+export(data) string
}
class YamlExporter {
+export(data) string
}
class DataExporter {
-exporter: ExporterRole
+exporter_for(format)$ ExporterRole
+supported_formats()$ list
+export_data(data) string
}
DataExporter o-- ExporterRole : has exporter
ExporterRole <|.. CsvExporter : with
ExporterRole <|.. JsonExporter : with
ExporterRole <|.. YamlExporter : with
YamlExporterを追加する
まず、YAML形式で出力するエクスポーターを追加します。
| |
既存のコードを変更する必要はありません。ExporterRoleの約束に従ったクラスを追加し、%exporter_mapにエントリを追加するだけです。
完成したデータエクスポーター
全機能を統合した完成版コードです。
| |
動作確認
3つの形式すべてで出力してみましょう。
CSV形式:
| |
| |
JSON形式:
| |
| |
YAML形式:
| |
| |
すべての形式で正しく出力されました!
振り返り:第1回との比較
第1回では、if/elseで形式を切り替える素朴な実装でした。
| |
今は、形式ごとに専用クラスがあり、追加も簡単です。
| |
この設計の特徴
- 拡張が容易 - 新しい形式はクラスを追加してマッピングに登録するだけ
- 変更が安全 - 1つの形式の変更が他に影響しない
- テストが容易 - 各エクスポーターを個別にテスト可能
- 型安全 - does制約で間違ったオブジェクトを防止
- 動的切り替え - 実行時にエクスポーターを変更可能
| |
まとめ
- YAML形式を追加して、データエクスポーターを完成させました
- 3つの形式(CSV、JSON、YAML)に対応しています
- 新しい形式の追加は、クラス作成とマッピング登録だけでOK
- メイン処理はシンプルで、if/elseがありません
次回「第10回-これがStrategyパターンだ!」は最終回です。実は、ここまで作ってきた設計には名前があります。その名前を明かし、なぜこの設計が良いのかを解説します。お楽しみに!
