Personalmente non mi piace la funzionalità "passa per riferimento" offerta da vari linguaggi di programmazione. Forse è perché sto solo scoprendo i concetti di programmazione funzionale, ma ottengo sempre la pelle d'oca quando vedo funzioni che causano effetti collaterali (come manipolare i parametri passati per riferimento). Personalmente abbraccio fortemente il principio della "responsabilità singola".
IMHO, una funzione dovrebbe restituire solo un risultato / valore usando la parola chiave return. Invece di modificare un parametro / argomento, vorrei solo restituire il valore del parametro / argomento modificato e lasciare tutte le riassegnazioni desiderate fino al codice chiamante.
Ma a volte (si spera molto raramente), è necessario restituire due o più valori di risultato dalla stessa funzione. In tal caso, sceglierei di includere tutti quei valori risultanti in una singola struttura o oggetto. Ancora una volta, l'elaborazione di qualsiasi riassegnazione dovrebbe essere all'altezza del codice chiamante.
Esempio:
Supponiamo che i parametri di passaggio siano supportati usando una parola chiave speciale come 'ref' nell'elenco degli argomenti. Il mio codice potrebbe assomigliare a questo:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Preferirei invece fare qualcosa del genere:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Quando avrei bisogno di scrivere una funzione che restituisca più valori, non userei neanche i parametri passati per riferimento. Quindi eviterei il codice in questo modo:
//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
Invece, in realtà preferirei restituire entrambi i nuovi valori all'interno di un oggetto, in questo modo:
//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);
Questi esempi di codice sono abbastanza semplificati, ma dimostrano approssimativamente come personalmente gestirò tali cose. Mi aiuta a mantenere varie responsabilità nel posto giusto.
Buona codifica. :)