В поисках лучшего способа вызова функции со слишком большим количеством параметров большинство из них не нужны
По некоторым причинам коллеги пишут функции со слишком большим количеством параметров, таких как это:
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)