設計原則の開放-閉鎖原則javascript

4148 ワード

プログラムの機能を変更したり、このプログラムに新しい機能を追加する必要がある場合は、コードを追加する方法を使用することができますが、プログラムのソースコードを変更することはできません.これはオープン・クローズの原則です.それを使う最も重要なのは、プログラムに変化が発生するところを見つけてから、変化をパッケージに入れて、変更することです.システム中の安定した部分と変化しやすい部分を隔離してもいいです.今後は修正が必要なら、パッケージの変化部分だけを修正して、もっとメンテナンスしやすいです.
一般的には、オープン・クローズの原則コードの作成、フックの配置、およびコールバック関数の使用のための2つの方法が用いられている.
ホックを置くということは、プログラムが変化する可能性があるところにホックを置き、その結果、プログラムの次の方向を決めることになります.これはパッケージの変化です.変更しやすいところにホックを置くと、この場所に分岐の可能性があります.もし後で修正すれば、あらかじめセットしたフックも修正した結果に応答します.このようにプログラムはもっと柔軟性があって、融通性があります.それにフックを通して私達はプログラム全体に対して良好なコントロールを維持しています.古典的な言葉で碁局は一気に生きました.
コールバック関数を使用して、私たちは通常、一部の変化しやすいロジックをコールバック関数にカプセル化し、その後、処理コールバック関数の安定性と閉鎖関数に導入します.このように、異なるコールバック関数は、異なる分岐に入ることができます.
公開-購読モードと職責チェーンモードの具体的な実装を以下に示します.
発表・購読モードは、観察者モードとも呼ばれ、複数のオブジェクト間の依存関係を低減するために使用されてもよく、1つのオブジェクトは、他のオブジェクトのあるインターフェースを再明示的に呼び出す必要はなく、変化する可能性のある傍受およびリリース関数を良好にパッケージ化している.以下は具体的な実現を提供します.消費者は販売所に購読します.
var event = {
    cilentList:[],
    listen: function( key, fn ){
        if( !this.clientList[ key ] ){//               ,            
            this.clientList[ key ] = [];
        }
        this.clientList[ key ].push( fn );
    },
    trigger: function(){
        var key = Array.prototype.shift.call( arguments ),
            fns = this.clientList[ key ];

        if( !fns || fns.length === 0 ){//           
            return false;
        }

        for( var  i = 0, fn; fn = fns[ i++ ]; ){
            fn.apply( this, arguments );
        }
    }
};

var installEvent = function( obj ){
    for( var  i in event ){
        obj[ i ] = event[ i ];
    }
};

var salesOffices = {};
installEvent( salesOffices );

salesOffices.listen( 'squareMeter88', function( price ){
    console.log( '  =' + price );
});

salesOffices.listen( 'squareMeter100', function( price ){
    console.log( '  =' + price );
});

salesOffices.trigger( 'squareMeter88', 2000000 );
salesOffices.trigger( 'squareMeter100', 3000000 );
イベントの対象は、販売所のオブジェクトにあるべき属性を含んでいます.購読リスト、傍受関数、リリース関数、購読リストには、購読者の欲しい情報と購読者のリリース要求(関数)があります.購読情報はキー値で、各購読者の要求は関数配列です.傍受関数は、購読者の需要を監督し、購読リストに保存します.リリース関数は、リリース時の具体的な実装で、主に購読リストを巡回します.
職責チェーンパターンは、複数のオブジェクトが要求を処理する機会を与え、要求の送信者と受信者との間の結合関係を回避し、これらのオブジェクトをチェーンに接続し、このチェーンに沿ってこの要求を伝達し、オブジェクトがそれを処理するまで、個々の変更しやすい処理要求のチェーン上にパッケージされた関数がある.要求を処理する方式が変化したら、チェーンのある一環を維持したり、チェーンを追加したりすればいいです.オーダー処理システムの職責チェーンを以下に示します.
var order500 = function( orderType, pay, stock ){
    if( orderType === 1 && pay === true ){
        console.log( '500     ,  100    ' );
    }else{
        return 'nextSuccessor';
    }
};

var order200 = function( orderType, pay, stock ){
    if( orderType === 2 && pay === true ){
        console.log( '200     ,  50    ' );
    }else{
        return 'nextSuccessor';
    }
};

var orderNormal = function( orderType, pay, stock ){
    if( stock > 0 ){
        console.log( '    ,   ' );
    }else{
        console.log( '      ' );
    }
};

var Chain = function( fn ){
    this.fn = fn;
    this.successor = null;
};

Chain.prototype.setNextSuccessor = function( successor ){
    return this.successor = successor;
};

Chain.prototype.passRequest = function(){
    var ret = this.fn.apply( this, arguments );

    if( ret === 'nextSuccessor' ){
        return this.successor && this.successor.passRequest.apply( this.successor, arguments );
    }

    return ret;
};

var chainOrder500 = new Chain( order500 );
var chainOrder200 = new Chain( order200 );
var chainOrderNormal = new Chain( orderNormal );

chainOrder500.setNextSuccessor( chainOrder200 );
chainOrder200.setNextSuccessor( orderNormal );
はコードの最後に3つの関数からなる職責チェーンを見ることができます.処理方法を追加し続けるなら、定義してから職責チェーンの中または最後に追加すればいいです.ソースコードを変更する必要はありません.
最後に述べるべきのは、オープン・クローズの原則は対象向けプログラミングの設計モードの中で非常に基本的な原則ですが、彼はまだ完全に守られていません.彼は原則は一つの提案です.実際には、プログラムを完全に閉じておくことは容易ではありません.多くの抽象的な概念を導入して、いくつかの私達の維持しにくい対象を形成して、極めて大きくコードの煩雑さを増加して、まして一部のコードはいずれにしても完全に密封することができないのです.だから、私達は実際に開発する時、環境の都合によって、どの程度の開放が必要ですか?
1.変化しやすいところを選んで、抽象的にパッケージ化するという変化
2.需要が満たされなくて、避けられない修正コードが発生した時、できるだけ修正しやすいところを修正します.