Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-03-29

オブジェクト思考でたくさんのボール

オブジェクト思考というとよく継承の話が取り上げられます。 継承によるプログラムの再利用も確かに便利なのですが、継承以前のもっと基本的なところにもオブジェクト思考の便利さがあるように思います。 というわけで今日はオブジェクト思考のメリットについて考えてみます。

次のプログラムはスクリーン(画面)上にたくさんのボールを表示して動かすプログラムです。ボールの位置(x, y)と初速(ax, ay)を乱数で初期化しています。

オブジェクト思考でない実装(あとで書く)

Ballをクラスにしてオブジェクト思考な実装をするとこうなります。

SX = 640 #スクリーンの横幅
SY = 480 #スクリーンの縦幅

class Ball
  def initialize
    @x = rand(SX)
    @y = rand(SY)
    @ax = rand(5) - 2
    @ay = rand(5) - 2
  end

  def move
    @x += @ax
    @y += @ay
    @ax *= -1 if @x < 0 || @x >= SX
    @ay *= -1 if @y < 0 || @y >= SY
  end

  def draw
    #スクリーンへの描画処理
  end
end

num_balls = 100
balls = Array.new(num_balls) { Ball.new }
while 1
  balls.each do |ball|
    ball.move
    ball.draw
  end
end

ボールの座標計算や描画処理がballクラスの中に入り、外側にはそのボールを扱うための最低限のインターフェースだけが残りました。このように分離すると、ボールの表示や座標管理のために必要な変数がballクラスの外側から見えなくなります。見えなくなるというのがとても重要で、例えばこれがサッカーゲームならボール以外にも

  • 選手
  • サッカーゴール
  • グラウンド
  • 観客
  • 点数表示

などいろんなものを同時に制御することになります。 これらのパーツをそれぞれオブジェクトとして実装し、必要なデータが必要なところだけでしか見えなくすれば、パーツごとの不必要な関連がなくなりすっきりします。同時にオブジェクト同士の必要な関連も明確になります。