K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[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のイメージだったので内部の方の実装をイメージしてました。
[この投稿を含むスレッドを表示] [この投稿を削除]