クラスを分割して管理する

前章までで、キーボードと時間計測を利用して、ごく簡単な自機と弾を作りました。

しかし、このまま要素が増えるたびにFieldに変数を追加していくと、変数の数が増えて大変なことになります。

コードの可読性も地に落ちます。

それを避けるために、この章では、自機や弾、敵をクラスに分割して管理する方法を学びます。

以下が完成イメージです。

shoot

まず、自機のクラスPlayerを作り、Fieldから分離します。

Fieldの中のプレイヤーに関する情報が、すべてplayerという変数に隠蔽されていることが分かります。

これなら、もしプレイヤーに関する変数を増やしたくなったとしても、Fieldではなく、Playerクラスの中に変数を追加すればよいことになります。

変数の数が同じでも、それらがすべてFieldの中で宣言されているのと、Playerなどのクラスにまとめられているのでは、読みやすさが大きく違います。

同時に、Fieldの各メソッドで、何をやっているかが分かりやすくなっていることに気づきましたか?

たとえば、keyPressed()メソッドの中を先ほどと比較してみましょう。

プレイヤー分離前

プレイヤー分離後

プレイヤーを分離する前のソースコードでは、keycodeをswitch文によって分岐させ、「x」や「y」の値を変化させていることしか分かりません。

「x」や「y」が具体的に何を意味するかは、Fieldクラスの変数の宣言まで戻らないと判断することはできません。

「player_x」のような名前を付けることも可能ですが、どんどんコードが冗長になってしまいます。

ここで、プレイヤーを独立したクラスに抽出した後のコードを見てみましょう。

「player.move()」メソッドにキーボード入力を渡すことで、プレイヤーを動かしているということが一目瞭然です。

同様に、paintComponent()の中のプレイヤーの描画も分かりやすくなっています。

このようにオブジェクト指向には、ソースコードを読んだときに何をしているかが分かりやすくなる、というメリットがあります。

これはある程度規模の大きな開発や、複数人での開発における大きな助けになります。

また、今回書き換えたように、プログラムの機能を変えずにソースコードを整理することをリファクタリングと呼びます。

同様に、弾もBulletクラスとして分離していきましょう。

Playerのときと同様に、記述がシンプル、かつ直感的になりました。

このまま、「z」キーが押されたときにプレイヤーの座標から弾が発射されるように、プログラムを改造してしまいましょう。

まず、プレイヤーに以下のshoot()メソッドを追加します。

次に、FieldのkeyPressed()メソッドに以下の記述を追加すれば改造は終了です。

zキーが押されたときに、player.shoot()メソッドで生成されたBulletクラスのインスタンスを、Field内のbullet変数に代入しています。

ただし、この際bulletを書き換えるので、古いほうの弾は消えてしまっています。

以下がこれまでのソースコードの全体になります。

ところで、このソースコード、長すぎませんか。

せっかくリファクタリングできれいにしたのに、結局読みにくくなってしまっています。

これを機に、クラスごとにファイルを分割しましょう。

別ファイルにクラスを作成するには、そのままソースコードを移せば大丈夫です。

ただし、ソースコードの最初で、packageとimportを設定しなおすのを忘れないようにしてください。

参考までに、netbeansでは以下の手順で新しいクラスを作成できます。

1.左上の赤く囲った場所をクリック

newclass1

2.「Javaクラス」を選択して「次」をクリック

newclass2

3.作成したいクラスの名前を入力して「終了」をクリック

newclass3

4.以下のようなファイルが生成されるので、クラスの部分をそのまま置き換える

newclass4

最後に、必要に応じてpackageの下に必要なimportを追加すれば完了です。

ところで、上の画像ではクラスの宣言時にpublicという接頭辞が付いていますが、この単語はファイル名とクラス名が同じときにだけ付けることができます。

付けなくても実行は出来ますが、一応付けておいてください。

[転職率95.1%]最短22日で未経験からプログラマーへ『GEEK JOB 転職コース』
geekjob_to_gol_banner_sp_06

『GEEKJOB 転職コース』では未経験からでもプログラミングや仕事の進め方を学習でき、プログラマーとして転職/就職できるまでサポートします。

  • 短期集中のプログラミング学習で未経験から最短22日での転職/就職ができる

  • IT業界の採用を熟知したメンターが就活サポート

  • わからないことは現役プログラマに質問できる

  • オフィスで働く上で必要なスキルを身に付けられる

  • 紹介可能企業は500社以上


文系出身だから、全くプログラミング経験がないから、プログラミングの学習に挫折してしまったから、といった方も関係ありません。

未経験からプログラマーを目指せる環境を用意しています。

詳しく見る

この記事の内容について報告する