[JAVA] Méthode "void" ou faire un "return"

Méthode "void" ou faire un "return" [JAVA] - Java - Programmation

Marsh Posté le 08-07-2008 à 09:53:21    

Je me posais une question
 
Imaginons qu'on ai un tres gros StringBuffer  
 
Est ce qu'il vaut mieux modifier le StringBuffer à l'aide d'une méthode void et modifier le parametre passer en référence

Code :
  1. public void voidAjouter ( StringBuffer sb) {
  2.       sb.append("coucou" );
  3. }


 

Code :
  1. StringBuffer bw = new StringBuffer ();
  2. voidAjouter(sb);


 
ou bien en passant par un return

Code :
  1. public StringBuffer retourAjouter (StringBuffer sb) {
  2.       return sb.append("coucou" );
  3. }


 

Code :
  1. StringBuffer sb = new StringBuffer ();
  2. sb = retourAjouter(sb);

Message cité 1 fois
Message édité par Lenoiche le 08-07-2008 à 14:15:42
Reply

Marsh Posté le 08-07-2008 à 09:53:21   

Reply

Marsh Posté le 08-07-2008 à 11:12:35    

Aux dernières nouvelles BufferedWriter#write renvoie void, donc le 3e bloc de code ne veut rien dire. Au final il n'y a pas de différence, mais il faudrait plus de code pour savoir quel est le but de ta fonction d'écriture.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-07-2008 à 11:47:12    

okay mauvais exemple
 
prenons l exemple d'un StringBuffer

Reply

Marsh Posté le 08-07-2008 à 14:06:12    

Je te conseille fortement de prendre la 1ere solution car si ta fonction retourne toujours le paramètre, ça ne sert à rien.
 
De plus imaginons 3 appels consécutif à la même méthode :
 
Version pas de retour :  

Code :
  1. voidAjouter(sb);
  2. voidAjouter(sb);
  3. voidAjouter(sb);


 
Version 1 avec retour :

Code :
  1. sb = voidAjouter(sb); // l'affectation est inutile mais possible
  2. sb = voidAjouter(sb);
  3. sb = voidAjouter(sb);


 
Version 2 avec retour :

Code :
  1. // Super moche mais possible
  2. sb = voidAjouter(voidAjouter(voidAjouter(sb)));


 
...

Reply

Marsh Posté le 08-07-2008 à 14:29:36    

Je me posais cette question c'est parce que j'ai toujours eu l'habitude faire des return même si techniquement c'est inutile
je trouve cela plus pratique car imaginons une méthode qu'on découvre (on ne connait pas son comportement) comme celle ci
 

Code :
  1. public void voidAjouter() {
  2.      if (machin1) {
  3.           ...
  4.      }
  5.      elseif (machin2) {
  6.           ...
  7.      }
  8.      ...
  9.      elseif (machin56) {
  10.           ...
  11.      }
  12. }


 
Si je me retrouve dans le cas machin1, je suis quand même obliger de dérouler le code jusqu'à la fin pour savoir si je ne renter pas dans un cas tordu
 

Code :
  1. public StringBuffer retourAjouter() {
  2.      if (machin1) {
  3.           ...
  4.           return blabla
  5.      }
  6.      elseif (machin2) {
  7.           ...
  8.           return blabla
  9.      }
  10.      ...
  11.      elseif (machin56) {
  12.           ...
  13.           return blabla
  14.      }
  15. }


 
la je peux d'un coup d'oeil voir que le if s'arrête sur le return
 
Et donc je voulais votre avis
Et au niveau mémoire, corrigez moi si je me trompe mais cela ne prends pas plus de mémoire en passant par les returns (pointeurs sur le même objet , donc pas plus de mémoire toussa ...)


Message édité par Lenoiche le 08-07-2008 à 14:30:15
Reply

Marsh Posté le 08-07-2008 à 14:32:25    

Citation :

Si je me retrouve dans le cas machin1, je suis quand même obliger de dérouler le code jusqu'à la fin pour savoir si je ne renter pas dans un cas tordu


non non

 
Code :
  1. public void voidAjouter() {
  2.      if (machin1) {
  3.           ...
  4.           return;
  5.      }
  6.      elseif (machin2) {
  7.           ...
  8.           return;
  9.      }
  10.      ...
  11.      elseif (machin56) {
  12.           ...
  13.           return;
  14.      }
  15. }
 

De toute façon si tu n'as que des "else if" tu es sûr de ne pas avoir de surprise


Message édité par Bidem le 08-07-2008 à 14:33:34
Reply

Marsh Posté le 08-07-2008 à 14:57:03    

oui c'est vrai qu en y réfléchissant plus , c'etait une mauvaise habitude de ma part de toujours utiliser des return
 
merci Bidem d'avoir éclairci une zone d'ombre

Reply

Marsh Posté le 09-07-2008 à 00:57:07    

Dans ces cas-là,il est bon de se poser la question de savoir si on peut retourner une info utile plutôt que void, parce que trois fois sur quatre, cette info va être demandée par l'appelant. Donc se demander comment la fonction va être utilisée.

 

Par ex ici, je retournerais bien la longeur finale de sb.
Ca permet à l'appelant de faire en une ligne:
if (ajouter(sb) > 0){
   ...
}
else {
  ... //erreur : la chaîne est vide !
}

 

(bon, ici, l'exemple est mal choisi car la longueur est forcément > 0, mais si la fonction ajouter prenait deux paramètres: buf et une chaine supplémentaire à ajouter, la longueur finale serait une donnée certainement utile.)


Message édité par el muchacho le 09-07-2008 à 01:03:51

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 09-07-2008 à 03:52:18    

Lenoiche a écrit :

Je me posais une question

 

Imaginons qu'on ai un tres gros StringBuffer

 

Est ce qu'il vaut mieux modifier le StringBuffer à l'aide d'une méthode void et modifier le parametre passer en référence


question de sémantique et de clarté de ton api, mais dans le cas ou tu renvoie le SB, l'appelant peut se gourer et utiliser par la suite celui qu'il a passé a ta methode, qui n'est (dans aucun des deux cas, d'ailleurs) forcément le même.

 

le vrai cas vicieux c'est

Code :
  1. void addTo(StringBuffer sb, String s) {
  2. sb = new StringBuffer(sb);
  3. sb.append(s);
  4. }


... mais la au moins le seul qui se fait casser la gueule c'est le con qui a écrit la methode.

 

edit: et alors, j'veux bien que tu te la pètes bilingue, mais tu vas me faire le plaisir d'écrire tes noms de méthode en anglais, hein. (ne fut-ce que pour éviter les

Code :
  1. void ajouter(StringBuffer sb, String s) {
  2. sb.append(s);
  3. }

- sisi, déjà vu [:kiki])

Message cité 1 fois
Message édité par the real moins moins le 09-07-2008 à 03:54:27

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-07-2008 à 09:56:11    

the real moins moins a écrit :


edit: et alors, j'veux bien que tu te la pètes bilingue, mais tu vas me faire le plaisir d'écrire tes noms de méthode en anglais, hein. (ne fut-ce que pour éviter les

Code :
  1. void ajouter(StringBuffer sb, String s) {
  2. sb.append(s);
  3. }

- sisi, déjà vu [:kiki])


 
Alright , do not make useless "return" systematically and to force myself to name my objects in English  :pt1cable:  
 
 :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed