新しい出力形式を足すとき、既存のクラスを書き換えずに済むだろうか。前回の仕組みにプレーンテキスト変換の TextConverter を足し、変更せずに拡張できること(OCP)を Perl と Moo で確かめる。
Converter に分けても、要素の種類で分岐する if/else は残っている。要素側に accept を持たせ、Converter の visit_* を呼び分ける Double Dispatch で分岐を消す。Perl と Moo で実装します。
要素と出力形式の組み合わせで増え続ける if/else を、Converter クラスに分けて片付ける。Perl と Moo で Converter と HtmlConverter を作り、処理を委譲する設計に直す。
要素の種類で分岐する to_html を素直に書くと、要素を1つ足すたびに if/else が増えて既存の関数も直すことになる。Perl で書いたコードで、その増え方と限界を実際に体験する。
全部の行を同じ element として扱うと、見出しとコードブロックを見分けられず、変換で困る。Element を基底クラスに Heading・Paragraph・CodeBlock を継承で作り、種類ごとに分ける。Perl と Moo で実装します。
Markdown を HTML などに変換するには、文字列のまま扱うより、要素ごとのオブジェクトにしておくほうが後が楽になる。Perl と Moo で Element クラスを作り、段落をパースするところから始める。
Perl と Moo でダンジョン生成を作り、迷路型やテーマを継承で足すとクラスが掛け算で増える。そこを Bridge パターンで足し算に直す全7回の連載の目次です。困りごとからも選べます。
全7回の振り返り。Bridge の構成要素をダンジョン生成のクラスに当てはめ、Adapter・Strategy との違いと、使うべき場面の条件を整理します。
空間を再帰的に二分割して部屋を置く BSP を、アルゴリズム側の1クラスとして足す。テーマ側は書き換えず、3アルゴリズム×4テーマの12通りがそのまま動くことを確かめます。
Bridge で分けたあとに水中神殿テーマを足すと、書くのはテーマ1クラスだけで、既存のコードは変わらない。Open/Closed 原則を、全テーマ×全アルゴリズムの動作確認で確かめます。
アルゴリズムとテーマを別のクラス階層に分け、テーマからアルゴリズムへ委譲する(Bridge)。3×4=12クラスが9モジュールで済むことを、Perl と Moo の Role・委譲で確かめます。
ダンジョンの見た目のテーマ(城・遺跡)を継承で足すと、アルゴリズム×テーマの数だけクラスが増える。2×3=6クラスから、3×4=12クラスまで増える様子を書いて、分けて持つ設計の動機にします。
ランダム配置に加えて迷路型の生成を足す。再帰的バックトラック法で通路を掘ると、サイズ・マップ・表示のコードが前回のクラスとほぼ同じになる。重複がどこに出るかを確かめます。
ローグライク風のダンジョンを、壁と床の二次元配列で持ち、ランダムに床を掘って ASCII art で表示する。全7回の連載の最初の回で、Perl と Moo で作ります。
Perl と Moo で ECサイトの注文フローを作り、国内向けに海外向けを足したところで if/else が増え、組み合わせミスの事故に行き着き、Abstract Factory で組み直す全8回の連載の目次です。困りごとからも選べます。