Featured image of post if/elseで状態を切り替えていたPerlの自動販売機を、状態ごとのMooクラスに分けてStateパターンにたどり着く全10回【目次】

if/elseで状態を切り替えていたPerlの自動販売機を、状態ごとのMooクラスに分けてStateパターンにたどり着く全10回【目次】

Perl で自動販売機の状態を if/else で管理するところから始め、状態が増えて分岐が膨らんだところで、状態ごとのクラスと Moo::Role、状態を抱える VendingMachine(Context)に組み直し、最後に State パターンだと名前を付ける全10回の連載の目次です。どこから読むか、困りごとからも選べます。

Perl で自動販売機の動きを作りながら、状態の管理を組み直していく全10回の連載です。「待機中」と「コイン投入済み」を if/else で切り替えるところから始め、「払い出し中」「売り切れ」を足して分岐が膨らんだところで、状態ごとのクラス、共通のメソッドを決める Moo::Role、現在の状態を抱える VendingMachine(Context)へと組み直し、最後にそれが State パターンだと名前を付けます。

各回は前の回のコードに手を入れていく作りなので、通して読むなら第1回からが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。

対象は、Moo の has と sub でクラスを書け、Moo::Role と with を使ったことがある方です。コードは Perl v5.36 以降(サブルーチンシグネチャ)で書いています。Moo が初めてなら、先に前シリーズ「変数とサブルーチンだけで書いていたPerlを、Mooのクラスで整理する全12回」の目次(このページの最後にリンクがあります)から読んでください。

どこから読むか

  • 第1回 — 状態を if/else で書くところから、設計が変わる順にたどりたいなら。第2回で、状態を足すと何が困るかを確かめる
  • 第3回 — 状態をクラスに分ける形から入りたいなら。前提は第2回の、4つの状態を if/elsif で見分ける VendingMachine
  • 第6回 — 状態クラス自身に遷移先を決めさせる形を先に見たいなら。前提は第5回の VendingMachine(Context)
  • 第10回 — State パターンの構造と、Strategy パターンとの違いだけ知りたいなら。第9回の完成コードと対応表で照らし合わせる

困りごとから探す

状態が増えるたびに、if/else が伸びていく

  • 第1回 — 「待機中」のときと「コイン投入済み」のときで、同じボタンの結果を変えたい
  • 第2回 — 状態を1つ足すと、insert_coin も select_product も dispense も全部直すことになる

状態ごとのクラスに分けたが、まとまりがない

  • 第3回 — if/elsif で状態を見分けるのをやめて、状態ごとにクラスを分けたい
  • 第4回 — どの状態クラスにも同じメソッドを持たせたい。書き忘れを、呼び出す前に見つけたい
  • 第5回 — 呼び出し側が状態オブジェクトを付け替えている。使う側に状態クラスを見せたくない

状態の切り替えを、安全に・足しやすくしたい

  • 第6回 — 在庫を見て遷移先を変えたいのに、状態クラスから在庫が見えない
  • 第7回 — 状態に文字列のような間違った値が入っても、その場ではエラーにならない
  • 第8回 — 新しい状態を足すときに、VendingMachine やほかの状態クラスを触りたくない

仕上げて、パターンとして整理したい

  • 第9回 — 状態クラスをまとめて、コマンドを入力して動かせる形に仕上げたい
  • 第10回 — State パターンと Strategy パターンが似ていて、違いがわからない

全話一覧

必要なモジュール

全10回とも Moo を使います。インストールしてください。

1
cpanm Moo

関連シリーズ

変数とサブルーチンだけのPerlを、Mooのクラスで整理する(このシリーズの前提)

同じように if/else から始めて、Strategy パターンにたどり着く全10回(第10回で比べる相手)

参考リンク

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。