K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>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のイメージだったので内部の方の実装をイメージしてました。 >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!