JavaScriptインターフェースの実現方法の実例分析


本論文の実例は、JavaScriptインターフェースの実現方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
JavaScriptでインターフェースを実現する方法は3つあります。
第一に、注釈を使用した方法でインターフェースを実現する。
特徴:
(1)一番簡単ですが、一番弱い機能です。
(2)インターフェースとimplementの「文字」を利用する
(3)彼らを注釈で表現する
具体的な実現は以下の通りです。
1,注釈でインターフェースを定義する

 /*
  * interface PersonDao(){
  * function add(obj);
  * function remove(obj);
  * function find(id);
  * }
  * */
(2)実現インターフェースを注釈で明記する

 /*
  * PersonDaoImp implement PersonDao (PersonDaoImp    PersonDao) 
  * */
  var PersonDaoImp=function () {  };//     
   //  
  PersonDaoImp.prototype.add=function(obj){
    //    
  }
  PersonDaoImp.prototype.remove=function(obj){
    //    
  }
  PersonDaoImp.prototype.find=function(id){
    //    
  }
まとめ:
(1)誰が誰に実現されたかを文字で伝える
(2)メリットは、このように意義があり、大型プロジェクトに必要なのは規範と標準であり、書いていないで実現する前に、アーキテクチャと設計を十分に考慮することができる。
(3)短所:人工的に注釈の説明を守る必要があります。
第二に、属性検査法を用いてインターフェースを実現する。実質的には属性判断で誰が実現しましたか?
具体的には以下の通りです
1,注釈でインターフェースを定義します。

 /*
   * interface PersonDao(){
   * function add(obj);
   * function remove(obj);
   * function find(id);
   * }
   * */
2,インターフェースクラス+実装クラスに属性を追加することをコメントで説明します。

/*
   * PersonDaoImp implement PersonDao
   * */
  var PersonDaoImp=function () {
    this.implementInterface=["PersonDao"];//                ,
}
  PersonDaoImp.prototype.add=function(obj){
       alert(obj);
  }
  PersonDaoImp.prototype.remove=function(obj){
    //    
  }
  PersonDaoImp.prototype.find=function(id){
    //    
  }
(3)属性を検査する方法

 //                 Object
    function imp1(Object) {
    //            i=1:        ,            , i=1
      for(var i=1;i<arguments.length;i++){//arguments Object 
        var interfaceName=arguments[i];
        var interfaceFind=false;
        for(var j=0;j<Object.implementInterface.length;j++){
           if(Object.implementInterface[j]==interfaceName){
             interfaceFind=true;
             break;
           }
        }
        if(!interfaceFind){
          return false;
        }
      }
      return true;
    }
(4)インターフェースと実現類の協力実現

 function addObj(obj) {
    var PersonDao=new PersonDaoImp();
    //              
      if(!imp1(PersonDao,"PersonDao")){//         (  ,  )          ,          
        throw new Error("PersonDaoImp      PersonDao");
      }else{//  
        PersonDao.add(obj);
      }
  }
(5)使用

addObj("  ");

 まとめてみますと、この方法は実現時に属性と同じインターフェース名が伝達されているかどうかを簡単に判断するだけで、方法が実現されているかどうかを検証していません。
 そこで三つ目の鴨式変形法があります。インターフェースでの方法が実現されているかどうかを確認します。
第三に、アヒルの変形法は形のようなネーミング方法であり、オブジェクトにある方法がインターフェースで定義された方法と同名である場合、このインターフェースが実現されたと考えられる。
具体的には以下の通りです
1つのインターフェースを定義します。ここは上の二つと違っています。コメントを書かなくても大丈夫です。

var Interface=function (name,methods) {//name:    
    if(arguments.length<2){
      alert("       ")
    }
    this.name=name;
    this.methods=[];//            
    for(var i=0;i<methods.length;i++){
      if(typeof methods[i]!="string"){
        alert("           ");
      }else {
        this.methods.push( methods[i]);
      }
    }
  }
2,1つの静的方法を定義して、インターフェースと実装クラスの直接検査を実現する。
注意してください。静的な方法はInterface.prototypeと書かないでください。これはインターフェースのプロトタイプチェーンに書いたものです。静的な関数を直接クラスレベルに書きます。

Interface.ensureImplement=function (object) {
   if(arguments.length<2){
     throw new Error("       2 ")
     return false;
   }
   for(var i=1;i<arguments.length;i++){
     var inter=arguments[i];
     //         Interface  
     if(inter.constructor!=Interface){
        throw new Error("        ,    Interface  ");
     }
      //              
      //      
     for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//       

       //object[method]      
       if(!object[method]||typeof object[method]!="function" ){//                      
           throw new Error("                  ")
            }
          }
   }
 }
3,適用
3.1自分のインターフェースを定義する   
         例えば、ここで二つのインターフェースを定義します。

 var FirstInterface=new Interface("FirstInterface",["add","remove","search"]);//     
 var SecondInterface=new Interface("SecondInterface",["save"]);//     

3.2、実現類を定義する

 function commManager() {//     
    //     
    this.add=function () {
      alert("ok--  ");
    }
    this.remove=function () {
    }
    this.search=function () {
    }
    this.save=function () {
    }
    //  
    Interface.ensureImplement(this,GridManager,formManager);
  }
3.3、実現類の実用化

var comm=new commManager();
  comm.add();//  
 まとめ:3つの方法は自分の長所と短所があります。それぞれの選択は自分の必要に応じて選択します。しかし、設計の際にはクラス間の低結合を実現することが重要です。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容に興味がある読者は、当駅のテーマを見ることができます。「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」および「JavaScript数学演算の使い方のまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。