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クラスの外側から見えなくなります。見えなくなるというのがとても重要で、例えばこれがサッカーゲームならボール以外にも
- 選手
- サッカーゴール
- グラウンド
- 観客
- 点数表示
などいろんなものを同時に制御することになります。 これらのパーツをそれぞれオブジェクトとして実装し、必要なデータが必要なところだけでしか見えなくすれば、パーツごとの不必要な関連がなくなりすっきりします。同時にオブジェクト同士の必要な関連も明確になります。