naoya氏のところで、オブジェクト指向の説明文章が出ていたりしたので、便乗して自分なりの説明をしてみる。
私の感覚は、naoya氏の二つのダイアリーよりも、jkondo氏の捉え方の方が近いかな。(はてなダイアリーユーザーじゃないときは漢字氏名でお呼びした方がいいんだろうか?)
naoya氏
jkondo氏
オブジェクト指向の利点というのは、いろいろなものがオブジェクトという土俵の上で等価に扱えることだと思う。Cで手続き的に書くと、どうしても「同じようなちょっと違うもの」をIF文を使った条件分岐で分類してやらなければならなかったのが、オブジェクト指向をサポートする言語だとより「似たもの」らしく扱えるということだ。
例を見た方が分かってもらえると思うので、動的な多態(ポリモーフィズムやらポリモルフィズムやら言われるやつ)のサンプルとして、簡単なサンプルを書いてみた。
mp3やwav、midといった様々なファイルをMediaPlayerに叩き込んで連奏させてみようというプログラムだ。
まずは、演奏するファイルを作ってみる。
mp3 = "mp3 file"
wav = "wav file"
mid = "mid file"
できた。
次に肝心のプレイヤー・MediaPlayerを作ってみよう。ファイルを読み込んだら、デコードして演奏をすればよいだろう。
class MediaPlayer
def play(file)
file.decode
file.sound
end
end
ここまでであれば、20秒くらいでできてしまう。
さて、あとは各ファイルにデコードの手順と音を鳴らすためのやり方を教えてやらなければならない。
まずはデコード。
def mp3.decode
print "mp3 decoding...\n"
enddef wav.decode
print "wav decoding...\n"
enddef mid.decode
print "mid decoding...\n"
end
そして音の鳴らし方。
def mp3.sound
print "mp3 sound !!!!\n"
enddef wav.sound
print "wav sound !!!!\n"
enddef mid.sound
print "mid sound !!!!\n"
end
よし。準備は整った。なんて簡単なんだ。
ということで、実際に使えるか動かしてみよう。
player = MediaPlayer.new
player.play(mp3)
--) 実行結果
mp3 decoding...
mp3 sound !!!!
よし。成功。
もう一つ試してみるか。
player.play(wav)
--) 実行結果
wav decoding...
wav sound !!!!
はい。これまた成功。mp3もwavもばっちりだ。
じゃあ、まとめてplaylistを作って連奏させてみよう。これができなきゃMediaPlayerじゃないよね。
playlist = [mp3, wav, mid, mp3, wav]
playlist.each do |sound_file|
player.play(sound_file)
end
--) 実行結果
mp3 decoding...
mp3 sound !!!!
wav decoding...
wav sound !!!!
mid decoding...
mid sound !!!!
mp3 decoding...
mp3 sound !!!!
wav decoding...
wav sound !!!!
はい。無事に連続して鳴りました。
と、まぁ、こんなかんじで「似たもの」は似たものらしく扱えるのだ。
もちろんmp3やwav、midで実装する処理は違ってくる。デコードの方式も違うし、鳴らし方も違う。それでも、全てをオブジェクトとして扱うことで、とてもすっきりと人間にわかりやすい形でコード上で表現することができる。これはとても魅力的なことだと思うのだ。
これはあまりに単純化しているコードだけど、基本はこんなかんじのやつを作ってやって、あとはprint文でゴマカしているような実装の詳細をライブラリを探してきて解決するなり、自分でごりごり書くなりして、動くようにしてやれば立派にオブジェクト指向プログラミングになる。
ちなみに上記のサンプルコードはとてもシンプルなので、仮想言語での適当なサンプルと思った人もいるかもしれない。これ、Rubyです。実際にこれだけで動作もする。オブジェクト指向を体感したいなら、とても向いてる言語なので、興味を持った方はぜひお試しを。
ついでなので、以前にこのブログでも紹介したまつもと氏のオブジェクト指向の考え方と、そこから7年を経たまつもと氏の考えをご紹介。
まつもとゆきひろ氏のオブジェクト指向プログラミング観(1998)
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/6697
私の理解だと「オブジェクト指向」は「オブジェクトを中心にした
考え方」であり,「オブジェクト」の要件は「カプセル化」だと思
うので,「抽象データ型」はオブジェクト指向の範疇に含まれると
思います.ただ,オブジェクト指向プログラミングという話をする場合には
* カプセル化
* 継承
* 動的結合(ポリモルフィズム)がないと,オブジェクト指向プログラミングしている気にならない
と言うのは本当なのですが,分析レベルではかえって邪魔でしょう.で,rubyの(つーか,まつもとの)提案する設計法は
* 継承は使わない
* 既存のクラスのオブジェクトを抽象データ型として使う
* 場合によってはポリモルフィズムは活用する普通のユーザと
* 実装の共有(つまり楽するため)継承をがんがん使って
* クラスやモジュールを提供するライブラリ提供者の二層に明確に分かれる,というものです.
まつもとゆきひろ氏のオブジェクト指向プログラミング観(2005)
http://www.rubyist.net/~matz/20050204.html#p01
しかし、21世紀になるのに「オブジェクト指向の三要素(カプセル化、継承、ポリモルフィズム)」はないだろう、とか思った。カプセル化も継承も本質ではない(それらを含まないオブジェクト指向プログラミング言語やツールはいくらでもある)。この中で一番本質に近いのはポリモルフィズムだけ
そういえば、Ruby本の中でまつもと氏も「データよりもオブジェクトに何をさせるかを考えて、そこからプログラムをしていった方がいい」というような主旨のことを言われていたな。宮川氏流と一緒か。
で、注目の宮川さんは、最初にメインプログラムの中にオブジェクトと、そのオブジェクトに何をさせるかを書くそうです。つまり、インタフェースでプログラミングをしているそう。だから宮川さんのソースは綺麗なんだな、という秘訣がわかったり。
オブジェクト指向のそもそもの働きから考えても、これは自然だよなと思ってる。
なんだか散漫な終わりだけど、以上。