Javascript: шаблон конфигурации - PullRequest
5 голосов
/ 19 сентября 2011

Проблема : Javascript-функции требуется несколько параметров для работы:

function kick(person, reason, amount) {
    // kick the *person* with the *amount*, based on the *reason*
}

Поскольку нет способа перегрузить функцию в JS, как в Java , если он должен быть спроектирован для легкого улучшения в будущем (добавление параметров), его можно записать в виде:

/* Function Parameters pattern */
function kick() {
    // kick the person as in *arguments[0]*, with the amount as in *arguments[1]*,
    // based on the reason as in *arguments[2]*, with the strength as in *arguments[3]*
}

или

/* Object Configuration Pattern */
function kick(config) {
    // kick the person as in *config.person*, with the amount as in *config.amount*,
    // based on the reason as in *config.reason*, with the strength as in *config.strength*
}

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

Итак, вопрос : Если I не нужно добавлять какие-либо свойства с параметрамиЕсть ли существенная причина использования одного из предложенных решений в отличие от другого?

Ответы [ 3 ]

3 голосов
/ 19 сентября 2011

Использование объекта имеет несколько преимуществ:

1. Код более читабелен

Рассмотрим следующие два вызова:

kick({user: u,
      reason: "flood",
      log: true,
      rejoin: false,
      timeout: 60000,
      privmessage: true});

kick(u, "flood", true, false, 60000, true);

и представьте, что кто-то еще читает звонок. Какой первый true? Также обратите внимание, что через несколько месяцев вы будете в том же положении (не , помня , что является четвертым параметром для kick, очень похоже на то, что вы его не знаете).

2. Вы можете туннелировать параметры

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

function kickgroup(users, parms) {
    for (var i=0; i<users.lenght; i++) {
        var uparms = Object.create(parms);
        uparms.user = users[i];
        kick(uparms);
    }
}

Обратите внимание, что в случае arguments вам не нужно наказывать себя, используя синтаксис arguments[x]. Вы можете просто объявить параметры и добавить их по мере развития функции: любой параметр, который не был передан, будет установлен на undefined (и, если вам нужно, вы все равно можете получить доступ к arguments.length, чтобы определить, передал ли вызывающий явно вашу функцию undefined).

2 голосов
/ 19 сентября 2011

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

Предположим, у вас было три варианта kick(), одинэто берет человека, причину и количество, и тот, который берет только человека с разумом и суммой, получающего значения по умолчанию, и тот, который принимает объект конфигурации с по крайней мере человеком на нем.Вы можете динамически увидеть, какой из трех вариантов у вас есть, как это:

function kick(person, reason, amount) {
    if (person.person) {
       // must be an object as the first parameter
       // extract the function parameters from that object
       amount = person.amount;
       reason = person.reason;
    }
    amount = amount || 5;           // apply default value if parameter wasn't passed
    reason = reason || "dislike";   // apply default value if parameter wasn't passed
    // now you have person, reason and amount and can do normal processing
    // you could have other parameters too
    // you just have to be to tell which parameter is which by type and position

    // process the kick here using person, reason and amount
}
1 голос
/ 19 сентября 2011

Функции JavaScript подписаны только своим именем.

Следовательно, вы можете сделать:

  function kick(x, reason, amount) {
      if(reason && amount) {
          // do stuff with x as person, reason and amount
      }
      else if(x) {
          // do stuff with x as config
      }
      else {
         // do stuff with no parameters
      }

    }

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

   function kick() {
            alert(arguments.length);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...