数値とダイスをそれぞれ独立したクラスにし、evalメソッドで評価する設計に変更します。これが「終端式」と呼ばれる概念です。
ダイス言語に加減乗除を追加しようとして、if/elseの嵐に陥ります。なぜコードが複雑になるのか、その問題点を整理します。
TRPGで使われるダイス記法「2d6」を解釈して振る仕組みをPerlとMooで実装します。まずは最小限のDiceクラスを作り、ダイスを振る基礎を学びましょう。
PerlとMooでドキュメント変換ツールを作りながらVisitorパターンを学ぶシリーズの目次です。if/elseの限界からDouble Dispatch、OCPの体験まで、全8回で実践的に学びます。
シリーズで作り上げた設計がVisitorパターンだったことを明かし、パターンの正式な定義と構成要素を解説します。Double Dispatchの本質、パターンが威力を発揮する場面、そしてSOLID原則との関係を理解しましょう。
単語数をカウントするWordCounterと、リンクを抽出するLinkExtractorを追加します。変換だけでなく分析系の操作も同じ仕組みで実現でき、複数のVisitorが共存できることを確認しましょう。
新しい出力形式「プレーンテキスト」を追加します。TextConverterを作成するだけで、既存のコードを変更せずに機能拡張できることを体験しましょう。OCP(開放閉鎖の原則)の実践です。
if/elseを完全に排除するため、acceptメソッドとvisit_*メソッドによる「Double Dispatch(二重ディスパッチ)」の仕組みを導入します。要素自身が変換方法を決める設計を学びましょう。
if/elseの地獄を脱出するため、変換処理を別のクラスに分離します。ConverterクラスとHtmlConverterを作り、処理を委譲する設計を学びましょう。
パースした要素をHTMLに変換しようとすると、if/elseの条件分岐が爆発的に増えてしまいます。この問題を体験し、解決策を模索しましょう。
Heading、Paragraph、CodeBlockクラスを作成し、Markdownの様々な要素を適切に表現できるようにします。継承を使った要素クラスの分離を学びましょう。
Markdownをパースして段落要素を作成するツールを作ります。Elementクラスを使って、テキストをオブジェクトとして扱う基本を学びましょう。
PerlとMooでBridgeパターンを学ぶ実践連載の目次ページです。ローグライク風ダンジョン自動生成エンジンを作りながら、抽象と実装の分離、クラス爆発回避の設計技法を習得します。
Bridgeパターンの設計を総括し、AdapterやStrategyとの違いを明確化。Perlによる GoF パターン実装のベストプラクティスと、実務での応用例をまとめます。
部屋区分型(BSP)アルゴリズムを追加し、Implementor側の独立した拡張を体験。全9パターンの組み合わせをテストし、Bridgeパターンの拡張性を実証します。