「javascript設計モード」読書ノート一(インターフェイス)

6104 ワード

1.何がインターフェースですか
「デザインモード」を学んだことがある人たちは、プログラミングの原則を聞いたことがあるかもしれません.一体何がインターフェースですか?
インターフェースはオブジェクトが持つべき方法の手段を定義していますが、これらの方法の具体的な実現を具体的に規定していません.C荍やVB.NETを勉強したことがあります.インターフェースというのは方法名だけですが、実現していない特殊な種類です.
VB.NETのインターフェース
Public Interface Person
    Sub say()
    Sub eat()
End Interface

Public Class Man
    Implements Person

    Public Sub eat() Implements Person.eat

    End Sub

    Public Sub say() Implements Person.say

    End Sub
End Class
注意:VB.NETにおいて、実現クラスがインターフェース内のすべての方法を実現していない場合、コンパイラはエラーを報告します.
問題は、JavaScriptには内蔵されているインターフェースの作成や実現方法がなく、内蔵されている方法もなく、オブジェクトがインターフェースを実現しているかどうかを判断するための方法があります.しかし、ある種の模倣を通じて、いわゆるインターフェースが実現されるということです.
 
2.JavaScriptにおけるアナログインターフェース
1)コメントでインターフェースを説明する
/*
         
interface Person {
    function say();
	function eat();
}



*/
//                      ,               
var Man = function(id, method, action) { //    Person    
    ...
};

//         

Man.prototype.say = function() {
    ...
};
Man.prototype.eat = function() {
    ...
};



最も簡単な書き方では、インターフェースは具体的に実現されていないので、実現する機能を知っていればいいです.だから、実現するインターフェースを注釈に書いて、実現する種類に実現の方法を知ってもらえばいいです.
2)属性で模擬インターフェースをチェックする
注釈でインターフェースを説明するよりも、この方法はやや厳密であり、それらのインターフェースを実現したことを声明することができ、これらと関連したい対象は声明に対して検査することができる.ここで、インターフェースはまだ注釈ですが、属性を検査する方法がもう一つ増えています.この方法によって、ある種類がそのインターフェースを実現したことが分かります.
3)アヒルの形の弁別の模擬インターフェース
// Interfaces.
//      
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);

//      

var CompositeForm = function(id, method, action) {
   ...
};

...

function addForm(formInstance) {
    ensureImplements(formInstance, Composite, FormItem);
    //                 ,      
    ...
}
あるインターフェースを実現するのは簡単だと判断します.ある種類の中の方法名とインターフェースの中で一致すれば、このインターフェースが実現されたと思います.まるで、アヒルのように、カンガルーという声が聞こえます.
 
3.インターフェースを模倣する過程
1)他の言語を勉強したことがある親たちは、インターフェースとは実現できない方法の集合を含んでいることを知っています.したがって、インターフェースを模倣するなら、JavaScriptでは、Interfaceクラスに配列のメンバーを追加しなければなりません.methodsは、これらの方法名を保存するために使用されます.もう一つのパラメータが必要です.name.便利になったら、どのインターフェースを実現しましたか?
2)上述のC〓の編纂のインターフェースのように、C〓の中でもし1つの種類はあるインターフェースを継承したら、しかしすべてその方法を実現していない時、コンパイラは間違いを報告して、それによって私達に注意します.しかし、JavaScriptはこの機能を持っていません.したがって、一般的な方法を定義する必要があります.ensureImplements.実装クラスがインターフェースのすべての方法を実現しているかどうかをお知らせします.
4.インターフェースの実現コード
/*
 *        ,  2      ,           ,             ,       
 * @param {Object} name
 *    
 * @param {Object} methods
 *          ,       ,                  
 */
var Interface = function(name, methods){
	if(arguments.length < 2){ //       2,     
		throw new Error("Interface constructor called with" + arguments.length + 
			"arguments, but expected at least 2");
	}
	
	this.name = name;
	this.methods = [];
	
	for(var i = 1, len = arguments.length; i < len; ++i){
		if(arguments[i] instanceof Array){ //      ,      
			for(var j = arguments[i].length - 1; j > -1; --j){
				if(typeof arguments[i][j] !== 'string' ){//            ,      
					throw new Error('Interface constructor expects method names to be passed in as a string');
				}
				
				this.methods.push(arguments[i][j]); //     
			}
		} else if(typeof arguments[i] === 'string'){ //      ,    
			this.methods.push(arguments[i]);
		} else { //      
			throw new Error('Interface constructor expects method names to be passed in as a string');
		}
	}
};

/*
 *         ,            ,               ,          
 * @param {Object} object
 */
Interface.ensureImplents = function(object){
	if(arguments.length < 2){
		throw new Error("Interface constructor called with" + arguments.length + 
			"arguments, but expected at least 2");
	}
	
	var _checkMethods = function(inface){ //    ,           ifs      
		var methods = inface.methods,
		          i = methods.length - 1;
			
		for( ; i > -1; --i){
			var method = methods[i];
			//         ,         ,      
			if(typeof object[method] === 'undefined' || typeof object[method] !== 'function'){
				throw new Error("Function Interface.ensureImplents: object does not implent the " + 
					inface.name + "interface. Method " + method + " was not found."	);
			}
		}
	};
	
	
	for (var i = arguments.length - 1; i > 0; --i) {
		if(arguments[i] instanceof Array){
			for(var j = arguments[i].length - 1; j > -1; --j){
				if(!arguments[i][j] instanceof Interface){
					throw new Error('Function Interface.ensureImplents expects arguments two and above to be' +
						'instances of Interface');
				}
				_checkMethods(arguments[i][j]); //      
			}
		} else if(arguments[i] instanceof Interface){
			_checkMethods(arguments[i]); //      
		} else {
			throw new Error('Function Interface.ensureImplents expects arguments two and above to be' +
				'instances of Interface');
		}
	}
};
5.牛刀小試し
 
    
    
        //        ,      say eat
        var IPerson = new Interface('IPerson', 'say', 'eat');
        //        
        var Man = {
            say: function () {
                alert("    ");
            },
            eat: function () {
                alert("     ")
            }
        }

        //             
        function test(ITestInstance) {
            //          ,                
            Interface.ensureImplents(ITestInstance, IPerson);
            ITestInstance.say();
            ITestInstance.eat();
        }

        test(Man); //       

    
6.まとめ
インターフェースは私達に便利をもたらします.同時に多くの困難をもたらします.特にJavaScriptの中では、補助類と方法によって、ある種類のインターフェースが実現されたことを強制的に保証する必要があります.
6.まとめ
インターフェースは私達に便利をもたらします.同時に多くの困難をもたらします.特にJavaScriptの中では、補助類と方法によって、ある種類のインターフェースが実現されたことを強制的に保証する必要があります.