@nqounetです。
新シリーズ「PerlとMooでモンスター軍団を量産してみよう」を始めます。全6回の連載で、モンスターを効率的に大量生産する技術を学びます。
このシリーズについて
このシリーズは、「Mooで覚えるオブジェクト指向プログラミング」シリーズの続編です。前シリーズでMooの基本を学んだ方を対象としています。
まだ読んでいない方は、先に以下の記事をご覧ください。
学習ゴール
- 既存オブジェクトをコピーして新しいオブジェクトを効率的に生成する方法を習得
- 「浅いコピー」と「深いコピー」の違いを実体験で理解
- MooX::CloneやStorable::dclone()を使いこなせるようになる
対象読者
- Perl入学式を卒業したばかりの方
- Mooの基本(
has、new、extends)を理解している方 - 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方
シリーズ全体の目次は以下をご覧ください。
今回のゴール
モンスターを10体作りたいとき、new()で毎回全属性を指定するとコードが冗長になる問題を実感します。次回以降で解決策を学ぶための布石です。
シナリオ:スライム軍団を作りたい!
あなたはRPGゲームのモンスターデータを管理するプログラムを作っています。まずは基本のモンスター「スライム」をたくさん作りたいと考えました。
「スライムを10体作ろう!」
気合十分でコードを書き始めます。
Monsterクラスを定義する
まず、モンスターを表すMonsterクラスを作りましょう。
| |
1体作るのは簡単ですね。では、10体に増やしてみましょう。
問題:10体作るとコードが膨れ上がる
同じスライムを10体生成するコードを書いてみます。
| |
これは辛い……。同じ内容を10回も書いています。
この方法の問題点
- 冗長: 同じパラメータを10回書くのは面倒
- 修正が大変: HPを10から15に変えたい場合、10箇所を修正する必要がある
- タイポのリスク: どこかでパラメータを間違えても気づきにくい
- スケールしない: 100体、1000体になったら現実的ではない
「量産型ザクを3行で作りたい」のに、現状では30行以上必要です。
ループで解決できる?
「ループを使えばいいのでは?」と思うかもしれません。確かに以下のように書けます。
| |
だいぶマシになりましたが、まだ課題があります。
- バリエーションを作りたいとき: 赤スライム、青スライム、金スライムなど色違いを作りたい場合、結局パラメータを全部書き直す必要がある
- ベースを複製したいとき: 「この強いスライムをベースに、少しだけ変えた個体を作りたい」という場面で、元のオブジェクトからコピーできない
「既存のスライムをコピーして、色だけ変えたい」そんな便利な方法があればいいのに……。
今回の完成コード
今回は問題提起がメインなので、完成コードは「問題が発生している状態」を示します。
| |
まとめ
new()でオブジェクトを作成する際、毎回すべての属性を指定する必要がある- 同じパラメータを何度も書くのは冗長でミスの温床になる
- 既存オブジェクトを「コピー」して新しいオブジェクトを作る方法があると便利
- 次回は、この問題を解決する
clone()メソッドを学ぶ
次回予告
次回は、MooX::Cloneというモジュールを使って、既存オブジェクトをコピーする方法を学びます。「3行でスライム軍団を量産する」夢が叶います。お楽しみに。
