Featured image of post Perlのnew()の限界からclone()、深いコピーを経てPrototypeパターンにたどり着くモンスター量産の全6回【目次】

Perlのnew()の限界からclone()、深いコピーを経てPrototypeパターンにたどり着くモンスター量産の全6回【目次】

同じモンスターを大量に作るときの new() の限界から始め、MooX::Clone の clone()、浅いコピーの罠、Storable::dclone() の深いコピーを経て、GoF の Prototype パターンにたどり着くまでの全6回の目次です。各回は前の回の続きなので、第1回から順に読む連載です。

Featured image of post clone() で量産してきた仕組みは、GoF の Prototype パターンだった。Factory Method との違い【Prototype】

clone() で量産してきた仕組みは、GoF の Prototype パターンだった。Factory Method との違い【Prototype】

第1回から作ってきた「既存オブジェクトを複製して新しいオブジェクトを作る」やり方に、GoF の生成パターン Prototype という名前を付けます。構成要素を Monster と Weapon に対応させ、Factory Method との違いを表とコードで比べ、Moo::Role で明示的に表す方法まで扱います。

Featured image of post 浅いコピーでドラゴンの武器が共有される問題を、Storable::dclone() の深いコピーで直す【Deep Copy】

浅いコピーでドラゴンの武器が共有される問題を、Storable::dclone() の深いコピーで直す【Deep Copy】

Storable::dclone() で独自の clone() メソッドを書き、武器を含むドラゴンを丸ごと複製します。dragon2 の武器を変えても dragon1 は変わらず、武器オブジェクトのアドレスも別になることを確認します。MooX::Clone との使い分けとして、単純な属性だけなら MooX::Clone、ネストがあれば dclone と整理します。

Featured image of post clone() したドラゴンの武器を書き換えたら、元のドラゴンの武器も変わった。浅いコピーの罠【Shallow Copy】

clone() したドラゴンの武器を書き換えたら、元のドラゴンの武器も変わった。浅いコピーの罠【Shallow Copy】

武器 Weapon を持つドラゴンを MooX::Clone の clone() で複製し、dragon2 の武器の威力を20に変えると、元の dragon の威力も20になります。clone() は参照だけをコピーするので2体が同じ Weapon を共有している、という浅いコピーの仕組みを、出力と参照の比較で確かめます。

Featured image of post Moo で同じスライムを10体作ると、new() の属性指定だけで30行以上になる【コンストラクタ】

Moo で同じスライムを10体作ると、new() の属性指定だけで30行以上になる【コンストラクタ】

RPG のモンスター管理で Monster クラスを Moo で定義し、スライムを10体作ると同じ属性指定を10回書くことになります。冗長になる、修正が10箇所に及ぶ、タイポに気づきにくい、100体では破綻するという4つの問題と、ループにしても色違いや既存個体からの複製は解けない理由を確かめます。

Featured image of post ログも実績もサウンドも足すたびに攻撃処理が膨らむPerlのローグライクを、Mooで通知の仕組みに分けてObserverパターンにたどり着く全10回【目次】

ログも実績もサウンドも足すたびに攻撃処理が膨らむPerlのローグライクを、Mooで通知の仕組みに分けてObserverパターンにたどり着く全10回【目次】

Perl と Moo で作るローグライクの攻撃処理に、ログ・実績・サウンド・統計を足すたびに if/else が膨らむ困りごとを、通知先のクラス分けと登録の仕組みで解いて、最後に Observer パターンと名前を付ける全10回の連載の目次です。どこから読むか、困りごとからも選べます。