Мне лично не нравится функциональность «передача по ссылке», предлагаемая различными языками программирования. Возможно, это потому, что я просто открываю концепции функционального программирования, но я всегда получаю мурашки по коже, когда вижу функции, вызывающие побочные эффекты (например, манипулирование параметрами, передаваемыми по ссылке). Я лично твердо придерживаюсь принципа «единой ответственности».
ИМХО, функция должна возвращать только один результат / значение, используя ключевое слово return. Вместо изменения параметра / аргумента я бы просто вернул измененное значение параметра / аргумента и оставил любые желаемые переназначения до вызывающего кода.
Но иногда (надеюсь, очень редко) необходимо возвращать два или более значений результата из одной и той же функции. В этом случае я бы предпочел включить все эти результирующие значения в одну структуру или объект. Снова, обработка любых переназначений должна быть до вызывающего кода.
Пример:
Предположим, что передаваемые параметры будут поддерживаться с помощью специального ключевого слова, например, «ref» в списке аргументов. Мой код может выглядеть примерно так:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Вместо этого я бы предпочел сделать что-то вроде этого:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Когда мне нужно написать функцию, которая возвращает несколько значений, я также не буду использовать параметры, переданные по ссылке. Поэтому я бы избегал кода, подобного этому:
//The Function
function doSomething(ref value) {
value = "Bar";
//Do other work
var otherValue = "Something else";
return otherValue;
}
//The Calling Code
var value = "Foo";
var otherValue = doSomething(value);
console.log(value); //Bar
console.log(otherValue); //Something else
Вместо этого я бы предпочел вернуть оба новых значения внутри объекта, например так:
//The Function
function doSomething(value) {
value = "Bar";
//Do more work
var otherValue = "Something else";
return {
value: value,
otherValue: otherValue
};
}
//The Calling Code:
var value = "Foo";
var result = doSomething(value);
value = result.value; //Reassignment
console.log(value); //Bar
console.log(result.otherValue);
Эти примеры кода довольно упрощены, но они примерно демонстрируют, как я лично справлюсь с такими вещами. Это помогает мне держать различные обязанности в правильном месте.
Удачного кодирования. :)