[425] Re:クラスメソッドとクラス変数
投稿者:タイガー
2007/02/20 02:13:25
Rubyで、kitさんのcompare()メソッドを実装するにはどうすれば実現可能か考えてみました。
まず、Array(配列を表す)クラスの他にLinked(リンクリストを表す)クラスが
あると過程して、この2つのクラス両方がcompare()に区別なく渡せるような実装を考えます。
方法1. ArrayとLinkedの両方に共通なメソッドで、各要素を先頭から順に
取り出せる関数(インターフェース)を定義する。
つまり、next()、isDone()、currentItem()を両方のクラスに実装する。
compare()に、ArrayやLinkedのインスタンスを渡し、
このメソッドを使って実装する。
方法2. Iteratorクラスを作る。ArrayクラスとLinkedクラスの区別は、
Iteratorクラスの中に隠す。
compare()に、Iteratorのインスタンスを渡す。
方法3. Linkedにも(Arrayクラスの様な)to_aメソッドを実装し、
to_aで、全要素を配列にして1つずつ比較。
私はあまりRubyに精通していないので、以上の単純な方法を考えました。
まず、方法3ですが、実現はできてもcompare()の実装の「ロジック」が
ストレートな表現ではないため、良い方法とは思えません。同様に
特殊なことで実現できたとしても同じ意味で良くないです。
方法1は、「データ構造」クラスの中に(2つのクラスに共通な、つまり抽象的な)
データのアクセサをつけることで実現します。
方法2は、kitさんと同様にIteratorクラスで表現する方法です。
方法1と方法2の比較ですが、どちらが良いのかは難しいですが、
Arrayクラスをあまりよごしたくないので、直感的にはIteratorクラスを
作成する方が良いように思えます。
>しかし、記述力というか、制御構造の自由度という点では
>ArrayIterator 的なやり方の方が優れていますから、もしもどちらか
その通りかもしれません。
>実際のところは、たいていの言語のコレクションライブラリが、each
>メソッド式と、ArrayIterator 的方法の両方の機能を提供しているよ
>うな気がします。
RubyはIteratorクラスがありません。observer(Observableモジュールを使う)
とかはあるみたいなので、Iteratorも標準で入れて欲しいです。
>この場合、ArrayIterator() 式を外部 Iterator、each メソッド式を
>内部 Iterator と呼んで区別するようです。
結局、データ構造のクラスの中に入れるか、別のクラスにするかという
感じでしょうか。
私もIteratorと言うと外部の方が思い浮かびます。Javaのイメージで。
crowbarは、Rubyのイメージだったので内部の方の実装をイメージしてました。