JQuery / Javascript: Как я могу эффективно оценить достоверность аргументов функции с диапазоном допустимых типов? - PullRequest
1 голос
/ 18 апреля 2011

У меня есть довольно большой плагин, который я сейчас пишу в jQuery, который использует множество внутренних функций, которые могут принимать различные аргументы в зависимости от функции.

Я поймал себя на том, что постоянно пишу следующее в каждой функции, чтобы остановить выполнение кода, если аргумент не был предоставлен или недействителен:

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

Я надеялся, что в смысле DRY было бы неплохо написать небольшую внутреннюю вспомогательную функцию, которая бы сделала это для меня.

Является ли это на самом деле хорошей идеей и, что наиболее важно, каков наилучший / безопасный способ проверки различного диапазона приемлемых аргументов?

В этом плагине много функций с несколькими аргументами, например:

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

, где filename - это string, path является string, excludeFromRandom является boolean и callback может быть function или string.

Каков хороший способ проверить наличие и достоверность аргументов такого типа, не переписывая один и тот же код снова и снова?

Любые предложения и идеи будут великолепны.

Спасибо за чтение.

1 Ответ

2 голосов
/ 18 апреля 2011

Это зависит от того, в какой степени вы хотите это сделать. Идея заключалась бы в создании функции проверки, которая принимает отображение argument -> rule. E.g.:

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 принимал обратный вызов, который вызывается при ошибке или успешном завершении функции вместо возврата значения. Есть много возможностей.

...