大量のオブジェクトを処理するときに考えた事(2)(イテレーターパターンについて)

大量のオブジェクトを処理するときに考えた事(1)(イテレーターパターンについて) - kkana's blogこれを書いているときに勘違いしていたこと1つめ

itpro.nikkeibp.co.jp

このページで イテレーターパターンとは「オブジェクトの持つデータ構造を非公開にして、hasNext()とnext()という2つのメソッドだけを公開するというものです」 とあります。前回書いたものはすべてのメソッドを公開にしていたのでちょっと違うかも・・・。

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

もう一度これを参考に書くと・・・

  //イレテータパターン
  var List = function(dataArray){
      //ポインタの位置
      var index = 0;
      //データ
      var data = dataArray;
      //データの数
      var length = data.length;

      return {
        //現在のポインタのデータを返す
        current : function(){
          return data[index];
        },
        //次があるか?
        hasNext : function(){
          if(index < length){
            return true;
          }
          else{
            return false;
          }
        },
        //次の要素を返す
        next : function(){
          if(!this.hasNext()){
            return false;
          }
          else{
            index++;
            return data[index];
          }
        },
        //ポインタを先頭に戻す
        rewind : function(){
          index = 0;
        }
      }
  }

var dataArray = [];
for (var i = 0; i < 10; i++) {
  var p = i;
  dataArray.push(p);
}
var list = List(dataArray);


while (list.hasNext()) {
  console.log(list.current());
  list.next();
}

という感じかなぁ・・・。dataはプライベートでもっておく。 公開する部分にhasNext nextの他に、現在のデータを返すものと、巻き戻しを入れておきました。