オブジェクト指向の勉強の一環としてGofのデザインパターンを
C#でサンプルプログラミング中です。
その中で、Iteratorパターン(並び替え)がありますが、
Iteratorパターンと.NetにあるListやGeneric機能の違いが分かりません。
ListにもGeericにもSortメソッドや、Indexからピンポイントでの値取得も可能です。
何か考え違いしていますでしょうか。
また、もっとIteratorパターンにはもっと大きなメリットがあるのでしょうか。
宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
こんにちは。
Iteratorパターンと.NetにあるListやGeneric機能の違いが分かりません。
Iteratorパターンは、「要素を枚挙するためのインターフェース」を定義し、このインターフェースを継承したコンテナの要素を枚挙する場合は常に同じ使い方(インターフェース)でできるようにするという考え方です。
Genericsは、異なる型でも同じアルゴリズムで取り扱えるケースについて「型」をバラメータとして与えることで、異なる型に対して同じアルゴリズムを適用させるための仕組みです。
つまり、Iteratorパターンはインターフェースを共通化することで使い方を統一するという考え方で、Genericsは実装をなんども書かなくて良くする仕組みです。
さて、List<T>には両方が使われてますね。
IEnumerable<T>が「要素を枚挙するためのインターフェース」のC#における実装です。これを継承しているので、Listを使う人はIEnumerable<T>インターフェースに従ってList内の要素を枚挙できます。
また、List<T>はT型のデータを保持できます。追加/削除等のアルゴリズムは型Tが異なっても同じアルゴリズムで対応できるのでGenericsで実装されてます。
IEnumerable<T>インターフェースを継承しているGenericsクラスで良く使われるものにDictionary<TKey, TValue>もありますね。List<T>とDictionary<TKey, TValue>ではデータの使い方が異なるので同じアルゴリズムで実装できないため、異なるGenericsクラスで実装されてます。
しかし、使う人はListを使う時と同じ方法で要素を枚挙できます。
投稿2015/12/18 01:13
編集2015/12/18 01:17総合スコア23272
0
こんにちは。
間違ってませんよ。
List<T>はIEnumerableを実装しています。
C#でイテレータを実装する場合は上記インターフェイスを使用します。
なのでList<T>はIteratorなクラスです。
ただし、GenericはList<T>でいうTの部分です。
GenericではないIterator実装も当然ありますので混同しないほうが良いでしょう。
<追記>
誤りがありました。
StripeさんがおっしゃっているようにIteratorパターンはインターフェイスを提供する意味で使うもので、中身の実装(順番とか並び替えとか)に焦点をあてたものではありません。
そうした中で「間違ってませんよ」と回答してしまったのは不適切だったかも。訂正します。
投稿2015/12/17 16:05
編集2015/12/17 16:09総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
デザインパターンは、何らかの処理やデータ構造などを設計するときの「典型例」に名前を付けたものなので、実際にC#などのクラスライブラリに実装されているクラスとの機能の違いを比較することは、あまり意味がありません。
なかなか説明するのは難しいのですが、デザインパターンは、GoFたちが「こういう処理をするにはこういう設計にすればなんとなく良さそうな感じだよね」というものをサンプルコード付きでまとめたものです。一方のC#のクラスライブラリは、マイクロソフトが「こういう処理をするにはこのクラスが必要だ」と考えて作ったものです。
つまり、両者は目的も考え方も違います。同じように見えるのは、最初に書いたようにIteratorパターンが「典型例」だからです。
もっとIteratorパターンにはもっと大きなメリットがあるのでしょうか。
ないです。あまり深く考えてはいけません。自分がC#で何か作ろうとして、それがListやGenericでできることであればそれを使えば良いです。もしListやGenericできないことなら、Iteratorパターンは、おそらく参考にはなりません。
とはいえ、ある処理をどう設計/実装するかの勉強には良い教材だと思います。Listクラスは中身を見ることができないので、Iteratorパターンの方は「設計の勉強になる」という点がメリットかもしれません。
投稿2015/12/17 16:03
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。