javascriptモード——Command

3555 ワード

計算機のプログラムを作るとしたら
var calculator = {

    add: function( x, y ){

        return x + y;

    },

    sub: function( x, y ){

        return x - y;

    }

}



//   

calculator.add(1,2);
calculator.addという直接的な呼び出しにより、加減算の計算機機能を実現しました.でも、多くの場合、直接にcaculatorに訪問したくないです.その理由は、他のオブジェクトのcacacalltorへの依存が増加するからです.考えてみてください.私たちは計算機の機能を実現しました.他の多くのところでcalculator.addを使って、多くの呼び出しをしています.この時、私達はcacalculator計算機というオブジェクトの構造を修正すると、すべての呼び出し計算機を同時に修正します.これはできるだけオブジェクトをデカップリングするOOP理論に大きく背いている.
 
コードを修正します.
入口関数を追加することにより、入力されたコマンドに従って、どの関数を呼び出すかを選択します.コードは以下の通りです
var calculator = {

    add: function( x, y ){

        return x + y;

    },

    sub: function( x, y ){

        return x - y;

    }

}



//

calculator.calculate = function ( method ) {

    return calculator[method] && calculator[method].apply( calculator, [].slice.call(arguments, 1) );

};



//     

console.log( calculator.calculate('add',1,2) );
このとき、外部呼び出しは、cacacalltorオブジェクトへの依存を低減します.では、先ほどの問題を思い出してみます.cacalculatorの構造修正は外部呼び出しの修正を引き起こしますか?答えはできません.caculatorの構造が変わった時、私達はcaculatorのcalculateに対しても相応の調整を行うだけで、外部の呼び出しは変化に従って必要としません.
var calculator = {

    box:{

        add: function( x, y ){

            return x + y;

        },

        sub: function( x, y ){

            return x - y;

        }

    }

    // other

}



//

calculator.calculate = function ( method ) {

    return calculator.box[method] && calculator.box[method].apply( calculator, [].slice.call(arguments, 1) );

};



//       

console.log( calculator.calculate('add',1,2) );