Personnellement, je n'aime pas la fonctionnalité «passer par référence» offerte par divers langages de programmation. C'est peut-être parce que je découvre juste les concepts de la programmation fonctionnelle, mais j'ai toujours la chair de poule quand je vois des fonctions qui provoquent des effets secondaires (comme la manipulation de paramètres passés par référence). Personnellement, j'adhère fermement au principe de la "responsabilité unique".
À mon humble avis, une fonction doit retourner un seul résultat / valeur en utilisant le mot-clé return. Au lieu de modifier un paramètre / argument, je retournerais simplement la valeur du paramètre / argument modifié et laisserais toutes les réaffectations souhaitées au code appelant.
Mais parfois (espérons-le très rarement), il est nécessaire de renvoyer deux ou plusieurs valeurs de résultat de la même fonction. Dans ce cas, je choisirais d'inclure toutes ces valeurs résultantes dans une seule structure ou un seul objet. Encore une fois, le traitement de toute réaffectation devrait être à la hauteur du code appelant.
Exemple:
Supposons que le passage de paramètres soit pris en charge en utilisant un mot clé spécial tel que «ref» dans la liste des arguments. Mon code pourrait ressembler à ceci:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Au lieu de cela, je préférerais réellement faire quelque chose comme ceci:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Lorsque j'aurais besoin d'écrire une fonction qui renvoie plusieurs valeurs, je n'utiliserais pas non plus les paramètres passés par référence. J'éviterais donc un code comme celui-ci:
//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
Au lieu de cela, je préférerais en fait retourner les deux nouvelles valeurs à l'intérieur d'un objet, comme ceci:
//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);
Ces exemples de code sont assez simplifiés, mais ils montrent à peu près comment je gérerais personnellement ce genre de choses. Cela m'aide à garder diverses responsabilités au bon endroit.
Codage heureux. :)