JavaScriptの中のmemorizing技術

9488 ワード

今日は「JavaScript」の設計モード第七章を見ています.工場モードの時にmemorizing技術に接触しました.簡単にいうと、ある方法に対して、その実例を呼び出して初めてそれを呼び出す時にのみ方法の計算を行います.その後、この例が再びこの方法を呼び出した時にコードの計算を行いません.最初の呼び出し時の計算結果をそのまま使用します.
まず簡単なコードを見てください.主な機能は今日の何曜日を知るためです.もちろんこの機能を実現するには、私のような複雑なコードは必要ありません.この技術を説明するためだけに.
function weekDay(){};
weekDay.prototype = {
    today: function(){
        var a = this.getweekDay();
        return a;
    },
    getweekDay: function(){
        var day = new Date().getDay(),
            str = "    ";
        switch(day){
            case 1:
                str += " ";
                alert(str);
                break;
            case 2:
                str += " ";
                alert(str);
                break;
            case 3:
                str += " ";
                alert(str);
                break;
            case 4:
                str += " ";
                alert(str);
                break;
            case 5:
                str += " ";
                alert(str);
                break;
            case 6:
                str += " ";
                alert(str);
                break;
            case 7:
                str += " ";
                alert(str);
                break;
            default:
                break;
        }
     // memorizing
this.getweekDay = function(){ return str; } return str; } };
コンソールでテストします.
var b = new weekDay();
b.today()   //  alert  (“     ”)

//       
b.today()   //    alert  
初めて運行した後、bがTodayメソッドを呼び出して、getweekDayの中のswitch文を見られます.代わりに、
this.getweekDay = function(){
    return str;
}
私たちは初めて呼び出した時に結果をstrに書きましたので、getweekDay方法を書き直したのと同じです.今日は水曜日です.後で計算する必要はありません.もちろん、あなたが一例を作成した後、Todayメソッドを呼び出した時に、getweekDayの中のswitch文を読みに行きます.この例については、この方法を初めて呼び出したので、まだgetweekDayに書き換えていません.
「JavaScriptデザインモード」のコードを見てみます.
/* SimpleHandler class. */

var SimpleHandler = function() {}; // implements AjaxHandler
SimpleHandler.prototype = {
  request: function(method, url, callback, postVars) {
    var xhr = this.createXhrObject();
    xhr.onreadystatechange = function() {
      if(xhr.readyState !== 4) return;
      (xhr.status === 200) ? 
        callback.success(xhr.responseText, xhr.responseXML) : 
        callback.failure(xhr.status);
    };
    xhr.open(method, url, true);
    if(method !== 'POST') postVars = null;
    xhr.send(postVars);
  },
  createXhrObject: function() { // Factory method.
    var methods = [
      function() { return new XMLHttpRequest(); },
      function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
      function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
    ];
    
    for(var i = 0, len = methods.length; i < len; i++) {
      try {
        methods[i]();
      }
      catch(e) {
        continue;
      }
      // If we reach this point, method[i] worked.
      this.createXhrObject = methods[i]; // Memoize the method.
      return methods[i];
    }
    
    // If we reach this point, none of the methods worked.
    throw new Error('SimpleHandler: Could not create an XHR object.');
  } 
};
主にブラウザによってXHRオブジェクトを作成するために使われます.赤い文字の行はmemorizing技術の実現です.どんなに複雑な計算をしても、その後再起動すると計算結果が得られますので、改めて計算する必要はありません.したがって、この後は現在のブラウザに対するコードのみが実行されます.もし前のコードがXMLttpRequestクラスのブラウザで実行されたら、2回目の実行時のcreateXrObject方法は実際にはこのようなものです.
createXhrObject: ffunction() { return new XMLHttpRequest(); }
メモリ技術はコードの効率を効果的に向上させることができます.設定と検出コードは一回だけ実行されます.
 
参考資料:JavaScriptデザインモード(Ross Harmes) / Dustin Diaz) 第七章--工場モード