Featured image of post 機能を足すたびにif/elsifを書き換えていたBBSを、ルートを1行足すだけにする。部品を1つのクラスにまとめる【ディスパッチャー】

機能を足すたびにif/elsifを書き換えていたBBSを、ルートを1行足すだけにする。部品を1つのクラスにまとめる【ディスパッチャー】

ここまで作ったルーティング・レジストリ・名前からのハンドラー生成を1つの Dispatcher クラスにまとめ、掲示板に組み込む。URL を渡せばハンドラーが選ばれて動き、機能を足すときは add_route を1行足すだけ。第1回の if/elsif と並べて比べます。

Featured image of post ハンドラーを足すたびに、登録の行も1行ずつ伸びていく。アクション名からクラスを読み込んで作る【動的なクラス読み込み】

ハンドラーを足すたびに、登録の行も1行ずつ伸びていく。アクション名からクラスを読み込んで作る【動的なクラス読み込み】

レジストリではハンドラーを使う前に全部登録しておく必要があり、10個、20個と増えると登録のコードも伸びる。'list' から Handler::List のようにクラス名を組み立て、Module::Load の load で読み込んで new する。登録しなくても名前だけでハンドラーが使えます。

Featured image of post どのハンドラーを使うかの判断が、呼び出し側のあちこちに散らばる。振り分けを司令塔クラスに任せる【委譲(handles)】

どのハンドラーを使うかの判断が、呼び出し側のあちこちに散らばる。振り分けを司令塔クラスに任せる【委譲(handles)】

利用側で ListHandler->new して run を呼んでいると、どのハンドラーを使うかの判断が呼び出し側に散らばり、ハンドラーを足すたびに呼び出し側も直すことになる。ハンドラーを属性に持つ Dispatcher クラスを作り、Moo の handles で run を委譲します。

Featured image of post 無名サブルーチンに、DBアクセスも検証も描画も詰め込むことになる。機能ごとにクラスへ切り出す【ハンドラークラス】

無名サブルーチンに、DBアクセスも検証も描画も詰め込むことになる。機能ごとにクラスへ切り出す【ハンドラークラス】

実際の機能はデータベースへのアクセス、バリデーション、テンプレートの描画と大きくなり、無名サブルーチンには収まらない。ListHandler や FormHandler のように機能ごとに Moo のクラスを作り、どれも同じ run メソッドで呼べるようにします。

Featured image of post 変数とサブルーチンだけで書いていたPerlを、Mooのクラスで整理する全12回【目次】

変数とサブルーチンだけで書いていたPerlを、Mooのクラスで整理する全12回【目次】

変数とサブルーチンだけで書いた Perl は、データと処理が散らばり、どこで値が変わったのか追えなくなる。Moo で掲示板アプリを1つ育てながら、クラス・カプセル化・継承・ロール・委譲・型制約まで、オブジェクト指向の基本を1回に1つずつ身につける全12回の案内板です。

Featured image of post いいね数に「たくさん」と入っても、計算するまで気づけない。属性に型を付けて入口で弾く【型制約】

いいね数に「たくさん」と入っても、計算するまで気づけない。属性に型を付けて入口で弾く【型制約】

like_count に文字列を入れても代入は通り、足し算をした所でおかしな結果になって初めて気づく。Moo の isa に Types::Standard の Int などを指定し、値を入れた瞬間にエラーにします。全12回で作った掲示板のクラス構成と、学んだ概念の一覧も付けた完結回。