Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1748 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1756699
Lenoiche
Posté le 08-07-2008 à 09:53:21  profilanswer
 

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
mood
Publicité
Posté le 08-07-2008 à 09:53:21  profilanswer
 

n°1756751
masklinn
í dag viðrar vel til loftárása
Posté le 08-07-2008 à 11:12:35  profilanswer
 

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
n°1756770
Lenoiche
Posté le 08-07-2008 à 11:47:12  profilanswer
 

okay mauvais exemple
 
prenons l exemple d'un StringBuffer

n°1756847
Bidem
Posté le 08-07-2008 à 14:06:12  profilanswer
 

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)));


 
...

n°1756863
Lenoiche
Posté le 08-07-2008 à 14:29:36  profilanswer
 

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
n°1756868
Bidem
Posté le 08-07-2008 à 14:32:25  profilanswer
 

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
n°1756903
Lenoiche
Posté le 08-07-2008 à 14:57:03  profilanswer
 

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

n°1757159
el muchach​o
Comfortably Numb
Posté le 09-07-2008 à 00:57:07  profilanswer
 

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
n°1757166
the real m​oins moins
Posté le 09-07-2008 à 03:52:18  profilanswer
 

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 ?
n°1757210
Lenoiche
Posté le 09-07-2008 à 09:56:11  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[JSF]erreur No Converter for type java.util.Date foundDéconnecter certains utilisateurs connectés à une application en java
[Java]Encodeur mpeg2[JAVA] Communication entre deux application Struts
crontab javaValeur par defaut et heritage + methode virtuelle
recherchons un codeur java pour integrer notre équipe de modeurJava/Servlets - Cookie et authentification (débutant)
Faire exectuer une ligne de commande à un programme JavaConvertir un PDF en Texte via Java
Plus de sujets relatifs à : [JAVA] Méthode "void" ou faire un "return"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR