2009年6月18日木曜日

オブジェクト指向

Javaによる暗号理論入門という本を少しずつ読んでいます。
最終的にはRSA暗号の作り方が書いてあるそうですが、最大公約数を求めるユークリッドアルゴリズムとやらの説明が良くわからなかったあたりから、rubyで簡単なスクリプトを書いていました。

その過程で、ちょっとだけオブジェクト指向の意味が判ったような気がします。
今までは、構造体+関数のようなものだと理解していました(これもおそらく、間違いではないはず)。一つのクラスから作ったインスタンスに計算に用いる関数とそこから生じる変数をまとめ、見通しを良くするための方法であると。

いままでは、以下のように書いていた部分があります(#以下コメント)


hoge=gets       #一行入力 ここでは数字を入力
hoge=hoge.chop   #末尾に入ってしまう改行記号を削除
hoge=hoge.to_i    #アスキーコードから整数に変換

foo=Foo.new      #クラスFooからインスタンスfooを作成
hoge=foo.bar(hoge)  #Foo内のメソッド"bar"で計算する。
puts hoge        #計算結果の出力



しかし、例えばgetsは戻り値を返す関数のようなものでありながら、同時にオブジェクトでもあるらしいとかの記述を見かけます。つまり、これ自体を値を持った変数のように扱うことができ、
hoge=gets.chop
と、getsの後ろにメソッドを追加してもいいことに気付きました。
今日はそんな感じでなるべく短い行で上の計算をまとめようといろいろ試し、結果下のようになりました。


puts Foo.new.bar(gets.chop.to_i)


上の1行だけで、上6行(空行をあわせれば7行)と同様の結果が得られました。
ただしこの方法では、クラスFooの中にある他の変数を取り出せなくなるため、もっと長いプログラムを書く場合は、無理にまとめず、foo=Foo.newは別にしてインスタンスを作ったほうがいいのかもしれません。


foo=Foo.new
puts foo.bar(gets.chop.to_i)


また、クラス(orインスタンス)=構造体+関数という部分に加え、そもそもこの理論を用いての考え方である「データをオブジェクトとして考える」というものが、プログラムを作るうえで適しているのかもしれません。

「オブジェクトとして書くことを求められる言語」ということじゃなくて、「オブジェクトとして考えをまとめていくことで、プログラムの可読性を上げる技術」といいますか。

関数やローカル変数を適切に使わないダメなプログラムのソースなんかと比較すると、オブジェクト志向を意識したプログラムは、より読みやすいものになりやすいかもしれません。

0 件のコメント: