Le "passage par référence" est-il une mauvaise conception ?
Pas en général. Vous devez comprendre votre scénario spécifique et vous demander ce que fait une fonction. Et vous devez définir correctement votre style de codage, en particulier si vous codez pour d'autres (distribution de bibliothèques).
Le passage par référence est généralement utilisé lorsque votre fonction renvoie plusieurs résultats. Il est souvent judicieux de renvoyer un ResultContainer
qui contient toutes les informations renvoyées par la fonction. Prenons l'exemple suivant en C# :
bool isTokenValid(string token, out string username)
VS
AuthenticationResult isTokenValid(string token)
class AuthenticationResult {
public bool AuthenticationResult;
public string Username;
}
La différence réside dans le fait que la méthode de référence (dans le cas présent out
put) indique clairement qu'il ne peut être utilisé que pour valider un jeton ou, éventuellement, pour extraire des informations sur l'utilisateur. Ainsi, même si vous êtes obligé de passer un paramètre, vous pouvez le jeter si vous n'en avez pas besoin. Le deuxième exemple est plus verbeux.
Bien entendu, le second modèle est préférable si vous disposez d'une telle méthode.
bool doSomething(object a, ref object b, ref object c, ref object d, ... ref object z);
Parce qu'il s'agit d'envelopper tous les produits dans un conteneur.
Permettez-moi de préciser : en Java et en C#, les types non primitifs sont les suivants toujours transmis en tant que référence clonée . Cela signifie que object
ne sont pas clonées elles-mêmes, mais seule leur référence est clonée sur la pile, et vous ne pouvez pas vous attendre à pointer sur un objet totalement différent après le retour. Au lieu de cela, il faut toujours s'attendre à ce que l'état de l'objet soit modifié par la méthode. Sinon, il suffit de clone()
l'objet et voilà.
Voici donc l'astuce : MutableInteger
ou mieux le Holder
est la solution pour passer des valeurs primitives par référence.
Il est actuellement utilisé par CORBA idl2java
lorsque votre IDL comporte un paramètre de référence.
Dans votre cas spécifique, je ne peux pas vous répondre sur la bonne ou la mauvaise conception parce que la méthode que vous avez montrée est trop générique. Réfléchissez-y. À titre d'exemple, si j'avais une fonction de post-traitement appliquée à des informations multimédias, comme le cryptage, j'utiliserais le passage de référence. Pour moi, la méthode suivante semble être une bonne conception
encrypt(x);
VS
x = encrypt(x);