Personalmente no me gusta la funcionalidad "pasar por referencia" que ofrecen varios lenguajes de programación. Quizás es porque estoy descubriendo los conceptos de programación funcional, pero siempre me pone la piel de gallina cuando veo funciones que causan efectos secundarios (como la manipulación de parámetros pasados por referencia). Yo personalmente abrazo firmemente el principio de "responsabilidad única".
En mi humilde opinión, una función debe devolver solo un resultado / valor utilizando la palabra clave return. En lugar de modificar un parámetro / argumento, simplemente devolvería el valor modificado del parámetro / argumento y dejaría cualquier reasignación deseada al código de llamada.
Pero a veces (con suerte muy raramente), es necesario devolver dos o más valores de resultado de la misma función. En ese caso, optaría por incluir todos esos valores resultantes en una sola estructura u objeto. Nuevamente, el procesamiento de cualquier reasignación debe corresponder al código de llamada.
Ejemplo:
Supongamos que se admiten parámetros de paso mediante el uso de una palabra clave especial como 'ref' en la lista de argumentos. Mi código podría verse así:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
En cambio, preferiría hacer algo como esto:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Cuando necesito escribir una función que devuelve múltiples valores, tampoco usaría parámetros pasados por referencia. Entonces evitaría un código 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
En cambio, preferiría devolver ambos valores nuevos dentro de un objeto, como este:
//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);
Estos ejemplos de código están bastante simplificados, pero demuestran más o menos cómo yo personalmente manejaría tales cosas. Me ayuda a mantener varias responsabilidades en el lugar correcto.
Feliz codificación :)