Featured image of post 継承とロールを合わせたら同名メソッドが衝突し、初期化順序が崩れて暴走した。操作と対象を分けて組む【Bridge】

継承とロールを合わせたら同名メソッドが衝突し、初期化順序が崩れて暴走した。操作と対象を分けて組む【Bridge】

操作方法と動作対象という2つの軸を継承とロールで1つにまとめると、同名メソッドの衝突で初期化が狂う。2軸を別々に持って委譲でつなぎ、どちらも独立に増やせるようにする(Bridge)。Perl と Moo で実装します。

Featured image of post 複製したはずのオブジェクトが、片方を変えるともう片方も壊れる。浅いコピーを避けて複製する【Prototype】

複製したはずのオブジェクトが、片方を変えるともう片方も壊れる。浅いコピーを避けて複製する【Prototype】

ハッシュ展開の浅いコピーで量産すると、複製同士が同じ内部オブジェクトを共有し、1つへの変更が全部に波及する。複製の責任を各オブジェクトに持たせて安全に増やす(Prototype)。Perl と Moo で実装します。

Featured image of post 引数が散らばって未完成のオブジェクトが出回る。組み立てを専用の部品に任せる【Builder】

引数が散らばって未完成のオブジェクトが出回る。組み立てを専用の部品に任せる【Builder】

コンストラクタに引数を並べるやり方では、渡し忘れや不正な値のまま未完成のオブジェクトが使われる。組み立て専用のクラスで段階的に作り、完成品だけを渡す(Builder)。Perl と Moo で実装します。

Featured image of post 砂漠用の防護服に氷雪用の動力炉が組み合わさる。一式をまとめて作って防ぐ【Abstract Factory】

砂漠用の防護服に氷雪用の動力炉が組み合わさる。一式をまとめて作って防ぐ【Abstract Factory】

環境ごとに防護服と動力炉を個別に作るため、砂漠用と氷雪用がちぐはぐに組み合わさる。部品一式を作る工場ごと切り替えて、不整合を作れなくする(Abstract Factory)。Perl と Moo で実装します。

Featured image of post 環境が増えるたびに膨らむ if/elsif。道具の選択と生成を分けて直す【Factory Method】

環境が増えるたびに膨らむ if/elsif。道具の選択と生成を分けて直す【Factory Method】

暗闇なら灯り、岩ならツルハシと、環境ごとに道具を作り分ける if/elsif が本体に居座っている。生成を切り出して、環境を足しても本体を触らずに済むようにする(Factory Method)。Perl と Moo で実装します。

Featured image of post レシピ指示を足すたびに文字列解析の if/elsif が伸びる。文法をオブジェクトの式ツリーにする【Interpreter】

レシピ指示を足すたびに文字列解析の if/elsif が伸びる。文法をオブジェクトの式ツリーにする【Interpreter】

レシピ指示の追加で if/elsif が泥沼化した文字列解析を、文法をオブジェクト化した式ツリーに置き換える。既存コードを直さずに指示を足せるようにする(Interpreter)。Perl と Moo で実装します。

連載 コードシェフ (第24話 / 全24話)
Featured image of post Singleton のせいでテストが書けず、並列実行で状態が汚れる。グローバルな依存を DI に置き換える【Singleton】

Singleton のせいでテストが書けず、並列実行で状態が汚れる。グローバルな依存を DI に置き換える【Singleton】

Singleton がテストを難しくし、並列実行で状態を汚す。その危うさを確かめたうえで、依存性注入(DI)に置き換えて堅牢でテストしやすい形にする(Singleton)。Perl と Moo で実装します。

Featured image of post 同じ設定のオブジェクトを毎回 new で作って、初期化コストが重い。出来上がったものを clone して増やす【Prototype】

同じ設定のオブジェクトを毎回 new で作って、初期化コストが重い。出来上がったものを clone して増やす【Prototype】

同じ設定のオブジェクトを毎回 new で生成し、初期化コストが跳ね上がる。Storable::dclone による深いコピーと Moo の writer で、安全に複製する(Prototype)。Perl と Moo で実装します。

Featured image of post 新しい操作を足すたびに全部の食材クラスを改修している。操作を別クラスに出して巡回させる【Visitor】

新しい操作を足すたびに全部の食材クラスを改修している。操作を別クラスに出して巡回させる【Visitor】

新しい操作を追加するたびにすべての食材クラスを改修することになる。既存クラスを変えずに操作を足せるよう、操作を別クラスに出して巡回させる(Visitor)。Perl と Moo で実装します。

Featured image of post メニューを足すたびにクラスファイルが倍々に増える。調理法と食材の2軸に分けて組み合わせる【Bridge】

メニューを足すたびにクラスファイルが倍々に増える。調理法と食材の2軸に分けて組み合わせる【Bridge】

メニューを追加するたびにクラスファイルが倍々に増える「継承爆発」。調理法クラスが食材ロールを委譲で持つ形にして、2つの軸を独立に増やせるようにする(Bridge)。Perl と Moo で実装します。