Panda Noir

JavaScript の限界を究めるブログです。

Iteratorパターンの利点

ES6で追加されたIterator。使い所が分かりづらいです。何が嬉しいのでしょうか?

繰り返しを抽象化できる

例えば配列に似たデータ構造にはjQueryオブジェクトや文字列なんかがあります。しかし、$('div')[0]とすると別の意味となります。$('div').eq(0)としなければいけません。

ということはjQueryオブジェクトの処理と配列の処理を分けなければなりません。

function someFunc(obj) {
    if (isJqueryObject(obj)) {
        for (var i = 0; i < obj.length; i++) {
            // ...
        }
    } else if (isArray(obj)) {
        for (var i = 0; i < obj.length; i++) {
            // ...
        }
    } else if (isString(obj)) {
        // ...
    }
}

ここで新たに配列に似たデータ構造がでてきたらまた対応しなければなりません。

ここで出てくるのがIteratorパターンです。Iteratorパターンでは配列もjQueryオブジェクトも文字列もIteratorとしてまとめて扱うことができます。

function someFunc(obj) {
    for (var item of obj) {
        // ...
    }
}

すっきりした上にすべてのIteratorをサポートできました。

総括

つまり 配列専用の関数を作る時にIteratorで作るのは無駄です 。配列以外に文字列も対応したい、jQueryオブジェクトにも対応したいという場合になって初めてIteratorパターンが生きてきます。

例えば二分探索の関数を書くときなんかは便利です。文字列に対して二分探索するときもありますので。

終わりに

直接書くことは少ないと思いますが知っておくと便利な考え方です。