Pessoalmente, não gosto da funcionalidade "passar por referência" oferecida por várias linguagens de programação. Talvez seja porque estou apenas descobrindo os conceitos de programação funcional, mas sempre fico arrepiado quando vejo funções que causam efeitos colaterais (como manipular parâmetros passados por referência). Pessoalmente, abraço fortemente o princípio da "responsabilidade única".
IMHO, uma função deve retornar apenas um resultado / valor usando a palavra-chave return. Em vez de modificar um parâmetro / argumento, eu retornaria o valor do parâmetro / argumento modificado e deixaria as reatribuições desejadas para o código de chamada.
Mas, às vezes (espero que muito raramente), é necessário retornar dois ou mais valores de resultado da mesma função. Nesse caso, eu optaria por incluir todos esses valores resultantes em uma única estrutura ou objeto. Novamente, o processamento de quaisquer reatribuições deve estar de acordo com o código de chamada.
Exemplo:
Suponha que a passagem de parâmetros seja suportada usando uma palavra-chave especial como 'ref' na lista de argumentos. Meu código pode ser algo como isto:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Em vez disso, eu preferiria fazer algo assim:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Quando eu precisaria escrever uma função que retorne vários valores, também não usaria parâmetros passados por referência. Então, eu evitaria códigos como este:
//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
Em vez disso, eu preferiria retornar os dois novos valores dentro de um objeto, assim:
//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);
Esses exemplos de código são bastante simplificados, mas demonstram aproximadamente como eu pessoalmente lidaria com essas coisas. Isso me ajuda a manter várias responsabilidades no lugar correto.
Feliz codificação. :)