Featured image of post 新しい操作を足すたびに、型判定の分岐が呼び出し側に増える。操作を訪問者にして追加する【Visitor】

新しい操作を足すたびに、型判定の分岐が呼び出し側に増える。操作を訪問者にして追加する【Visitor】

サーバーやケーブルといった要素に監査やログ収集を足すたび、呼び出し側で型を見分けて書き分けている。操作を訪問者のクラスにして、要素のクラスを変えずに新しい操作を足せるようにする(Visitor)。Perl と Moo で実装します。

Featured image of post 配列がむき出しで、構造が変わるたびに呼び出し側の走査を書き直すことになる。走査を専用の部品に任せる【Iterator】

配列がむき出しで、構造が変わるたびに呼び出し側の走査を書き直すことになる。走査を専用の部品に任せる【Iterator】

データベースの中身が配列のままむき出しで、呼び出し側がその構造を前提に走査している。連結リストなどに変わると走査を全部書き直すことになる。走査の手順を部品に閉じ込め、中身の構造を知らなくても順に読めるようにする(Iterator)。Perl と Moo で実装します。

Featured image of post カプセル化を壊さずに、状態を退避して後で戻したい。中身を覗かせない保管箱を作る【Memento】

カプセル化を壊さずに、状態を退避して後で戻したい。中身を覗かせない保管箱を作る【Memento】

内部状態を外へ出さずに、再起動の前に退避して、あとで元に戻したい。状態を丸ごと複製した保管用のオブジェクトを作り、持つ側には中身を見せないまま戻せるようにする(Memento)。Perl と Moo で実装します。

Featured image of post モジュール同士が直接呼び合って、依存が網の目になる。やり取りを仲介役に集める【Mediator】

モジュール同士が直接呼び合って、依存が網の目になる。やり取りを仲介役に集める【Mediator】

ジェネレータ、冷却器、バルブ、メインフレームが互いを直接参照し、組み合わせの数だけ依存が増える。やり取りを仲介役に集め、各部品は仲介役だけを知ればよい形にする(Mediator)。Perl と Moo で実装します。

Featured image of post 権限チェックを全部抱え込んだゲートが、条件を足すたびに膨らむ。審査を順に回す仕組みにする【Chain of Responsibility】

権限チェックを全部抱え込んだゲートが、条件を足すたびに膨らむ。審査を順に回す仕組みにする【Chain of Responsibility】

呼び出し側が個別のチェッカーを全部知っているため、チェックを足すたびにゲートを書き換えている。処理を次の担当へ順に渡す連鎖にして、呼び出し側を依存から外す(Chain of Responsibility)。Perl と Moo で実装します。

Featured image of post 崩落の検知に、ブザーと扉と照明を直接呼んでいる。変化を知らせるだけにして連動させる【Observer】

崩落の検知に、ブザーと扉と照明を直接呼んでいる。変化を知らせるだけにして連動させる【Observer】

検知した側が、ブザー、扉、照明を1つずつ呼び出していて、連動させたい対象を足すたびに本体が変わる。変化を通知するだけにし、受け手が自分で反応する形にする(Observer)。Perl と Moo で実装します。

Featured image of post レバーが機器を直接呼ぶ作りで、操作の履歴も取り消しもできない。操作をオブジェクトにする【Command】

レバーが機器を直接呼ぶ作りで、操作の履歴も取り消しもできない。操作をオブジェクトにする【Command】

送信元が受け手を直接呼ぶと、実行した操作を記録できず、元に戻すこともできない。操作そのものをオブジェクトにして、履歴を積み、Undo できるようにする(Command)。Perl と Moo で実装します。

Featured image of post 罠が増えるたびに defend メソッドを開いて書き換える。防御の方法を部品にして差し替える【Strategy】

罠が増えるたびに defend メソッドを開いて書き換える。防御の方法を部品にして差し替える【Strategy】

どの罠かの条件分岐と、それぞれの防御処理が1つのメソッドに同居し、罠を足すたびに本体を書き換えている。防御の方法を部品に分けて、実行時に差し替えられるようにする(Strategy)。Perl と Moo で実装します。

Featured image of post 解除コードを10個コピペして、手順の修正が全部に及ぶ。共通の流れを親にまとめる【Template Method】

解除コードを10個コピペして、手順の修正が全部に及ぶ。共通の流れを親にまとめる【Template Method】

スキャン、解読、ゲート解放、ログ記録という同じ手順のコードをコピペで量産し、プロトコルが変わるたびに全部直すはめになる。共通の流れを親クラスに置き、違う部分だけをサブクラスに任せる(Template Method)。Perl と Moo で実装します。

Featured image of post 数千体のゴーレムが同じデータを抱えてメモリが尽きる。共通部分を1つにまとめて共有する【Flyweight】

数千体のゴーレムが同じデータを抱えてメモリが尽きる。共通部分を1つにまとめて共有する【Flyweight】

同じ種類の敵が、変わらない設定を1体ずつ持つためにメモリが枯渇する。不変の部分を共有し、座標や HP のような個別の値だけを各自が持つ(Flyweight)。Perl と Moo で実装します。

Featured image of post 遠くて危険なデータ源へ、アクセス制限と取得の手間を呼び出し側に背負わせたくない。代理役を立てる【Proxy】

遠くて危険なデータ源へ、アクセス制限と取得の手間を呼び出し側に背負わせたくない。代理役を立てる【Proxy】

強い電磁場を放つデータ源へ直接つなぐと、権限が足りなければ回路が焼ける。同じ見た目の代理役を間に置き、アクセス制御、必要になるまで生成を遅らせる処理、取得結果のキャッシュを任せる(Proxy)。Perl と Moo で実装します。

Featured image of post バルブ、ダクト、点火を決まった順に呼ばないと爆発する。起動手順を窓口1つにまとめる【Facade】

バルブ、ダクト、点火を決まった順に呼ばないと爆発する。起動手順を窓口1つにまとめる【Facade】

複数の部品を正しい順序で呼ぶ知識が呼び出し側に散らばり、順序を間違えると事故になる。手順を窓口に閉じ込め、途中で失敗したときの巻き戻しも持たせる(Facade)。Perl と Moo で実装します。

Featured image of post 暗視も熱感知も付けたいのに、継承では組み合わせごとにクラスが要る。重ね着で機能を足す【Decorator】

暗視も熱感知も付けたいのに、継承では組み合わせごとにクラスが要る。重ね着で機能を足す【Decorator】

機能を継承で足すと、暗視と熱感知の組み合わせごとにクラスが増えて爆発する。同じ見た目の部品で包んで機能を重ね、組み合わせを実行時に選べるようにする(Decorator)。Perl と Moo で実装します。

Featured image of post 部品か集合体かを型で見分けて、再帰で電源を入れる。同じ扱いにそろえる【Composite】

部品か集合体かを型で見分けて、再帰で電源を入れる。同じ扱いにそろえる【Composite】

単体のセルと、中に他の要素を含むユニットを型判定で分けると、分岐のスパゲッティになる。同じ呼び方で扱える木構造にして、入れ子の深さを意識しなくて済むようにする(Composite)。Perl と Moo で実装します。