開放閉鎖原則のモデルの黄金法則


開放-閉鎖の原則はこのいくつかの原則の中で最も理解しやすいものであるべきだ.プログラムの機能を拡張したり変更したりしたい場合は、コードを追加することができますが、プログラムのソースコードを変更することはできません.もし、私たちにとって、最も速い方法はソースを変えることですが、私たちはもっと複雑なプロジェクトに向かっています.私たちの目的は私たちではなく、コード芸術家になって、芸術品のように私たちのプロジェクトを完成したいと思っています.デコレーションモードの例を挙げてみましょう.onloadの関数、すなわち他のパートナーを変更したい場合は、onloadにバインドされている可能性があります.onloadコードをめくって変更することができます.でも、この拡張性はすごい!!!装飾者モードから分かるように、リファレンス装飾を使用して変更することができます.
var fn = window.onload;
var change = function(){
    fn();
    conosle.log("    ");
}
window.onload = function(){  
    change();
}

もちろん、AOPを使用して、元のコード実装の機能を完全に保持し、外部にコードを追加するだけで装飾することもできます.またif文は開放閉鎖原則の死敵である.これは状態モードの一例である.
if(state === "auto"){
            console.log("  ");
            state = "hot";
        }else if(state === "hot"){
            console.log("  ");
            state = "cold";
        }else if(state === "cold"){
            console.log("  ");
            state = "wind";
        }else if(state === "wind"){
            console.log("  ");
            state = "dry";
        }else if(state === "dry"){
            console.log("  ");
            state = "auto";
        }

上のコードから分かるように、機能が変化し続けると、元のコードの内容を変更する必要があります.これは極めて望ましくありません.開放閉鎖の原則に基づいて最適化する必要があります
//    
var Auto= function(button){
    this.turn = button;
}
Auto.prototype.press= function(){
    console.log('  ');
    this.turn.setState("hot");
}
var Hot = function(button){
    this.turn = button;
}
Hot.prototype.press= function(){
    console.log('  ');
    this.turn.setState("cold");
}
var Cold = function(button){
    this.turn = button;
}
Cold.prototype.press= function(){
    console.log('  ');
    this.turn.setState("wind");
}
var Wind = function(button){
    this.turn = button;
}
Wind.prototype.press= function(){
    console.log('  ');
    this.turn.setState("dry");
}
var Dry = function(button){
    this.turn = button;
}
Dry.prototype.press= function(){
    console.log('  ');
    this.turn.setState("auto");
}
//      
var Remoter = function(){
    this.auto = new Auto(this);
    this.hot = new Hot(this);
    this.cold = new Cold(this);
    this.wind = new Wind(this);
    this.dry = new Dry(this);
    this.state = "auto";
}
Remoter.prototype.setState = function(state){
    this.state=state;
}
Remoter.prototype.press = function(){
    this[this.state].press();  //       press
}
Remoter.prototype.init = function(){  //     
    document.querySelector('.switch').addEventListener("click",()=>{
        this.press();
    },false);
}
new Remoter.init();  //   

すなわち,オブジェクトの多態性を用いて,条件分岐文を除去する.

オープンクローズモードの例外の処理


私たちはみな人間なので、最初から完璧なコードを書くことはできません.しかし、私たちはプログラムを書くとき、永遠に自分に手を残して、後で変更する必要があります.テンプレートモードでは,特殊性に裏道を残し,フック法を用いて外部の設定により不要な結果を得ることができる.もちろん、callback関数を使用して、$などの自分のやりたい機能を実行することもできます.ajax呼び出しの際、コールバック関数を追加し、自分の望む関数機能を実行することは、オープンクローズモードの原則を実現するための素晴らしい方法です.

最後の点


ここで言いたいのは、原則は指導であり、あなたのコードの結果をどのようにするかを導くことができ、最適な形式に達することができますが、実際には、私たちが守らないのは、個人にとって完全に依存しています.また、时にはプログラムを书いて、本当に设计を追求する必要はありません.私たちはユーザーの交付の需要を完成しているので、设计だけを追求すれば、コードの难しさと実现の时間を増やすに违いありません.だから、すべて感覚に従って行って、私たちがプログラムを書くのも感覚で書いたのではないでしょうか.