В поисках лучшего способа вызова функции со слишком большим количеством параметров большинство из них не нужны

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

function toBeUsedByOthers(a, b, c, d, e, f, g, h, x, y, z, userName, userId, userInfo3, userInfo4){
    // ...
}

Я знаю, что когда я звоню toBeUsedByOthers и передать его userId 789 делает то, что мне нужно (все остальные параметры не используются).

Есть ли лучший и правильный способ вызова этой функции, чем то, что я делаю сейчас:

toBeUsedByOthers(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 789, undefined, undefined)

?

Замечания:

  • Единственное ограничение, которое у нас есть, это то, что нам нужно передать весь список параметров (из a в userInfo4) но мы открыты для изменения формата (например, в случае необходимости их создания в массиве).

4 ответа

Решение
toBeUsedByOthers(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 789, undefined, undefined)

можно упростить с помощью оператора распространения

toBeUsedByOthers(...(new Array(12)).fill(undefined),789);

Но, как правило, вам следует избегать того, что многие неиспользуемые параметры могут вместо этого передавать объект:

function better({a,b,c}){
  console.log(a,b,c);
}

better({c:0});

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

function helloWorld(payload){
   console.log(payload.text);
   if (typeof payload.variable !== 'undefined'){
      console.log(payload.variable);
   }
   if (payload.hasOwnProperty('variable2')) {
      console.log(payload.variable2);
   }
}

helloWorld({ text: 'hello', variable : 'world', variable2: 'cake' });

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

var validPayloadProperties = ['a, b, c, d, e, f, g, h, x, y, z, userName, userId, userInfo3, userInfo4']

function helloWorld(payload){

   var payloadValid = true;

   // check payload to see if it has all the properties
   validPayloadProperties.forEach( function(property) {
     if (! payload.hasOwnProperty(property)) {
       payloadValid = false;
     }
   });

   // payload is not valid
   if(! payloadValid){
     return console.log('payload is not valid');
   }

   // payload is valid
  console.log('payload is valid');

}

// this is not valid...
helloWorld({ text: 'hello', variable : 'world', variable2: 'cake' });

Я советую вам переписать эту функцию. Это s example of anti-pattern. It Рекомендуется иметь не более 3 аргументов. Если функция имеет больше, чем: - она ​​должна быть разделена на большее количество подфункций; - его аргументы могут быть преобразованы в объект (экземпляр класса);

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

function multiply(x1, x2){
    return x1*x2;
}
function multiplyByTwo(a){
  return multiply(a, 2);
}

var b = multiplyByTwo(3);
console.log(b);

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

Также можно использовать ... с аргументом object.Rest аргументы являются настоящим массивом, а не просто похожими на массив аргументами

function toBeUsedByOthers(obj) {
  if (obj.a) {
    //rest of code
  }
  console.log(obj)
}

function toBeUsedByOthers2(...args) {
  if (args[0].a) {
    console.log(args[0].a);
  }

}

var myObject = {
  a: 'somVale1',
  b: 'someVale2',
}
toBeUsedByOthers(myObject)

toBeUsedByOthers2(myObject)

Другие вопросы по тегам