JavaScript 23種類のデザインモデルの23のインタプリタモード

14907 ワード

JavaScript 23種類のデザインモデルの23のインタプリタモード
  • 概念と特徴
  • 構造と実装
  • アプリケーションシーン
  • アプリケーション例
  • 総括
  • 概念と特徴
    概念:インタプリタモードとは、分析対象に言語を定義し、その言語の文法的表現を定義することです.もう一つの解釈器を設計して、文の中の文を説明します.アプリケーションの例をコンパイル言語で分析します.
    特徴:
  • 拡張性が良い.インタプリタモードでは、クラスを使って言語の文法規則を表しますので、継承などのメカニズムによって文法を変えたり、拡張したりすることができます.
  • が実現しやすい.文法ツリーの各表現はノード類が似ていますので、文法を実現するのが簡単です.
  • 実行効率が低い.説明する文が複雑である場合、その動作速度が遅く、コードの調整過程も面倒です.
  • は、クラス膨張を引き起こす.インタプリタモードの各ルールは少なくとも一つのクラスを定義する必要があり、多くの文法規則が含まれている場合、クラスの数が急激に増加し、システムの管理と維持が困難になる.
  • 構造と実現
    構造:インタプリタモードは、「抽象式」、「終端符式」、「非終端符式」、「環境」、「クライアント」を含む.【抽象式】インタプリタのインターフェースを定義し、インタプリタの解釈操作を約束する.【終端符表現】抽象表現のサブクラスで、文法の終端符に関する操作を実現します.文法の各終端符には具体的な終端符表現があります.【終端符ではない表現】抽象表現のサブクラスであり、文法の中で非終端符に関する操作を実現するために使用され、文法の各非終端符は具体的な終端符表現に対応します.【環境】:通常は、各解釈器に必要なデータまたは公共機能が含まれている.一般的に、すべてのインタプリタによって共有されたデータを転送するために使用され、後のインタプリタは、ここからこれらの値を取得することができる.【クライアント】解析が必要な文や表現を、インタプリタオブジェクトを用いて説明される抽象的な文法ツリーに変換して、インタプリタの解釈方法を呼び出しても良いし、環境キャラクタを介してインタラクタの解釈方法にアクセスすることもできます.
    実例:機能説明:「韶広東通」バスのカードリーダーが乗客の身分を判断できます.「韶関」または「広州」の「老人」、「女性」、「子供」なら無料で乗車できます.他の人は一回に2元を差し引きます.以上の機能を実現してください.
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <script>
        //      
        class Expression{
            interpret(info){}
        }
        //      
        class TerminalExpression extends Expression{
            constructor(data){
                super(data);
                this.set = new Set(data);           
            }
            interpret(info){
               if(this.set.has(info)){
                  return true
               }else {
                  return false
               }
            }
        }
        //       
        class AndExpression extends Expression{
            constructor(city,person){
                super();
                this.city = city;
                this.person = person;
            }
            interpret(info){
               let s = info.split(' ');
               return this.city.interpret(s[0])&&this.person.interpret(s[1])
            }
        }
        //  
        class Context {
            constructor() {
              //                  
                let citys = ["  ", "  "];
                let persons = ["  ", "  ", "  "];
                this.city = new TerminalExpression(citys);
                this.person = new TerminalExpression(persons);
                this.cityPerson = new AndExpression(this.city, this.person);
            }
             //                   
            action(info) {
                let ok = this.cityPerson.interpret(info);
                if (ok) {
                    console.log("  " + info + ",       !")
                } else {
                    console.log(info + ",       ,      2 !")
                }
            }
        }
        class Customer{
            static main(){
                let bus = new Context();
                bus.action("     ");
                bus.action("      ");
                bus.action("     ");
                bus.action("     ");
                bus.action("     ");
            }
        }
        Customer.main();
    </script>
    </body>
    </html>
    
    アプリケーションシーン
  • 言語の文法が簡単で、実行効率が重要な問題ではない場合.
  • 問題が繰り返し発生し、簡単な言語で表現できる場合.
  • 言語が解釈実行を必要とし、言語中の文が抽象的な文法ツリーとして表現される場合、XML文書のように解釈される.
  • アプリケーションのインスタンス
    以上の事例を参考にします.
    締め括りをつける
    インタプリタモードは、私たちがよく知っている抽象的な文法ツリーやJSXのようないくつかの文法に適用されます.【終端符表現】:1、マッチング対象を受信して格納する方法、2、interpret方法を提供する.この方法では、オブジェクトがマッチング対象にあるかどうかを判断する.
    【非終端符表現】:1、着信オブジェクトを受信して格納する方法、2、interpret方法を提供し、この方法では、着信オブジェクトを切り取ることにより、【終端符式】のinterpretメソッドを呼び出して、対象が適合対象にあるかどうかを判断する.
    【環境】:1、着信オブジェクトを提供し、2、実装し、【終端符式】と【非終端符式】を記憶し、3、action方法を提供します.この方法では、「終端符でない表現」を呼び出したinterpret方式で、対象がマッチング対象にあるかどうかを判断し、反応する.