2011-04-18 61 views
1

我有一個相當大的插件,我目前在jQuery中使用了很多內部函數,這些內部函數可以根據函數接受不同的參數。jQuery/Javascript:如何用一系列有效類型高效評估函數參數的有效性?

我回過神來不斷寫在每個功能下面從運行如果有一個參數沒有被提供或者是無效的停止代碼:

add : function(args) { 
    if (args===undefined) return; 
    // function code; 
},... 

我希望在DRY型感覺這將是一個好主意,寫一個內部輔助函數,可以爲我做到這一點。

這實際上是一個好主意,最重要的是檢查各種可接受參數範圍的最佳/安全方法是什麼?

有許多與在此插件的多個參數的函數,例如:

load : function(filename , path , excludeFromRandom , callback) {} 

其中filenamestringpathstringexcludeFromRandombooleancallback可以是一個functionstring

什麼是一種很好的方法來檢查這些類型的參數的存在性和有效性,而不必一遍又一遍地重寫相同的代碼?

任何建議和想法都會很棒。

感謝您的閱讀。

回答

2

這取決於你想要做到這一點。在想法上是創建一個驗證函數,它需要一個argument -> rule映射。例如:

function foo(somestring, somenumber) { 

    var rules = { 
     'somestring': Validator.rules.isString, 
     'somenumber': Validator.rules.inRange(5,10); 
    }; 


} 

Validator將包含基本邏輯和一些輔助功能(規則):

var Validator = { 
    valid: function(args, rules) { 
     for(var name in rules) { 
      if(!rules[name](args[name])) { 
       return false; 
      } 
     } 
     return true; 
    }, 
    rules: { 
     isString: function(arg) { 
      return (typeof arg === 'string'); 
     }, 
     inRange: function(x,y) { 
      return function(arg) { 
       return !isNaN(+arg) && x <= arg && arg <= y; 
      } 
     } 
    } 
} 

這僅僅是一個草圖,它當然可以被擴展(如接受每一個參數的多個規則),但它應該給你一些想法。

也就是說,你不必檢查的說法。提供體面的文檔。如果人們以錯誤的方式使用您的插件,即傳遞錯誤的參數類型,那麼您的代碼無論如何都會拋出錯誤。

更新:

如果要經常這樣做,那麼一個好主意就是寫一個包裝的功能,你只要傳遞函數和規則吧:

function ensure(func, rules, context) { 
    context = context || this; 
    return function() { 
     if(Validator.valid(arguments, rules)) { 
      return func.apply(context, arguments); 
     } 
     return null; // or throw error, whatever you want 
    } 
} 

然後您通常可以定義功能:

var foo = function(somestring, somenumber) { 
    // ... 
}; 

,只是添加驗證它:

var rules = {...}; 
foo = ensure(foo, rules); 

你甚至可以考慮讓ensure接受一個回調函數,該函數會在錯誤或函數成功時調用,而不是返回一個值。有很多可能性。

+0

謝謝,我會給這個去看看我是否可以設置這個我喜歡的。會有什麼方法直接將參數傳遞給函數,例如'args.isValid()',然後可以返回'true'或'false'? – Jannis 2011-04-18 09:03:21

+0

@Jannis:如果你的意思是'arguments.isValid()',那麼沒有。 – 2011-04-18 09:04:45

+0

是的,我希望這會工作,因爲它會使它成爲一個很好的可讀語句'boolean.isValid();'但我想只是爲'type'和'rule'設置和'object'也可以。謝謝。 – Jannis 2011-04-18 09:06:59

相關問題