в javascript один и тот же код разбирает аргументы в разных функциях - копировать или нет? - PullRequest
0 голосов
/ 06 августа 2011

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

Post.update = function( e ) {

        // parse args
        var e, el, orig_el, args, render, callBack;
        for( var i=0; i<arguments.length; i++ ) {
                if( arguments[i] instanceof HTMLElement ) orig_el = arguments[i];
                else if( arguments[i] instanceof Render ) render = arguments[i];
                else if( arguments[i] instanceof Event ) {
                        e = arguments[i];
                        orig_el = orig_el || e.target;
                }
                else if( typeof arguments[i] == 'function' )  callBack = arguments[i];
        }

        // Post.update work here
}

Post.verify = function( e ) {

       // parse args
       ...

       // Post.verify work here
}

Причины, по которым аргументы анализируются, а не передаются индивидуально, заключаются в том, что с пятью + возможными аргументами

  • Я склоненсовершать ошибки при упорядочении и пропуске вызова функций с длинным списком аргументов

  • изменение одного аргумента функции означает изменение каждого вызова функции

  • imho функция с пятью аргументами совершенно нечитаема по сравнению с передачей именно того, что необходимо

Поэтому моя цель состоит в том, чтобы абстрагировать секцию разбора функций, сохраняя при этом ясность вызовов функций какони сейчас.

Ответы [ 4 ]

1 голос
/ 06 августа 2011

Конечно, вы должны использовать функцию, чтобы предотвратить копирование и вставку всего этого кода!

Что если вы хотите изменить один символ в коде?Прямо сейчас вы должны скопировать и вставить все сноваЭто просто бесполезно.

Вставьте этот код в функцию и вызывайте ее каждый раз, поэтому, когда вы что-то изменяете в функции кода, это изменение будет отражаться в каждом месте, где используется эта функция.

Вы беспокоитесь о том, чтобы передать столько аргументов в функцию?Вы действительно должны быть обеспокоены, потому что передача большого количества аргументов в функцию - это очень плохо.Просто вставьте все свои аргументы в один объект и только передайте этот объект в функцию, например:

var arg = {
    arg1: 'bla bla bla',
    arg2: 4,
    //.....
};

// call the function passing only one parameter
myFunction( arg );

Тогда внутри функции у вас будет один аргумент, и вы сможете получить доступ ко всем остальным, как этот:

function myFunction( arg ) {
    // arg.arg1
    // arg.arg2 ...
}
1 голос
/ 06 августа 2011

Вместо того, чтобы анализировать 5 аргументов из функции, вы должны понимать, что функции не должны иметь более 3 аргументов.

Вместо этого вы хотите, чтобы последний аргумент был объектом

Post.update = function(ev, obj) {
  // obj.el
  // obj.render
  // obj.ev
  // obj.cb
}

Тогда просто есть функция, которую можно использовать повторно

Post.parseObj = function(obj) {
  ...
} 

Post.update = function(ev, obj) {
  obj = Post.parseObj(obj);
}
0 голосов
/ 06 августа 2011

Почему бы не использовать функцию Post.parseArgs?

Post.parseArgs = function(args)
{
    // parse args
    var e, el, orig_el, args, render, callBack;
    for( var i=0; i<arguments.length; i++ ) {
            if( arguments[i] instanceof HTMLElement ) orig_el = arguments[i];
            else if( arguments[i] instanceof Render ) render = arguments[i];
            else if( arguments[i] instanceof Event ) {
                    e = arguments[i];
                    orig_el = orig_el || e.target;
            }
            else if( typeof arguments[i] == 'function' )  callBack = arguments[i];
    }
    // return what you want...
}
0 голосов
/ 06 августа 2011

Определите функции один раз и используйте их снова

var update = function (e) { /* etc */ }
Post.update = update;
...