2d6+3 のようなダイス記法の文字列を読み取り、実際にダイスを振って結果を返すインタプリタを、Perl と Moo で作る全8回の連載です。ダイスを振るだけの小さなクラスから始め、計算式を足して if/else が破綻するところまで体験してから、式をオブジェクトの木で表す設計に組み替えます。最終回で「ここまで作ったのが Interpreter パターンだった」と名前がつきます。
このページは目次を兼ねた案内板です。初めてなら「読み方」から、いま if/else だらけの式の処理に困っているなら「困りごとから探す」から選んでください。
対象読者
「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方、または Moo でクラスを定義し、has 属性とメソッドが書ける方を対象としています。
読み方
- 通して読む: 第1回から順に。コードは前の回の続きなので、動かしながら進めるなら順番どおりが確実です
- if/else の増殖に困っているなら: 第2回で問題を、第3回から第5回で解き方を読めば要点がつかめます
- Interpreter パターンの名前と対応表が目的なら: 第8回から読み、気になった所だけ前の回に戻れます
全8回
- 2d6 を解釈して振りたい。まず最小の Dice クラスを作る【Moo】
- 2d6+3 に対応したら if/else の嵐になる。複雑さの正体を整理する【Perl】
- 数値とダイスをオブジェクトにして、eval メソッドで評価させる【Moo】
- 足し算を AddExpr クラスにする。左辺と右辺を再帰で評価する【Moo】
- 式クラスに eval を書き忘れても気づけない。Moo::Role で約束を強制する【Moo】
- 引き算と掛け算を足したい。既存クラスは1行も直さない【Moo】
- 文字列 2d6+3 から式ツリーを自動で組み立てる。パーサーを作って完成させる【Perl】
- ここまで作ってきた設計の名前は Interpreter パターンだった【Moo】
困りごとから探す
計算式を足すたびに if/else が伸びる
- 第2回 — 加算を足しただけで、正規表現と分岐が組み合わせの数だけ増える
- 第3回 — 数値とダイスを別のクラスに分けて、評価を各クラスに任せる
- 第4回 — 足し算を左辺と右辺を持つクラスにして、式を木で表す
演算を足すたびに既存コードを触りたくない
文字列の式を読み取って評価したい
仕組みに名前をつけて整理したい
- 第8回 — GoF の Interpreter パターンの登場人物と、ここまでの実装の対応
関連シリーズ
Composite パターンを学ぶと、Interpreter パターンの抽象構文木がより深く理解できます。
