その9 みんな時間を持っているじゃない
@ 時間を進める関数を抽出
今回もちょっとしたリファクタリングです。画面に出るキャラクタや、裏方さんの管理者などは、皆「単位時間」で行動を更新し、次の状態に移行します。CBulletやCPlayerはGoNext関数を持っていますし、CBulletManagerクラスも同じ関数を持っています。リファクタリングは「2重の防止」を原則とします。よって、この関数を抽出した抽象クラスを定義した方が良いと考えました。
CObjTimeクラスを新設します。宣言はとてもシンプルです。
ObjTime.h class CObjTime
{
piblic:
CObjTime(){};
virtual ~CObjTime(){};
virtual void GoNext() = 0; // 次の時間へ移行
};
この関数は純粋仮想関数とします。
たったこれだけなんですが、この抽出により、時間を進めるオブジェクトとそうじゃないオブジェクトを明確に分けて考えることが出来ます。
現在GoNext関数を宣言しているのはCCharacterクラスとCBulletManagerクラスですから、これらの親クラスをCObjTimeクラスにして、宣言を仮想関数にするリファクタリングを行います。これは、簡単ですね。
リファクタリングの結果、クラス図はちょっと発展しました。
面白いもので、リファクタリングを繰り返していくほどにクラス図は理にかなってゆきます。最初からこれを設計するのは、できなくはないですが、なかなか大変だと思います。
さて、次からは、敵キャラクタの自動的な動きについてYAGNIの原則で考えてみます。