2011-04-18 45 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

相关问题