Foros del Web » Programación para mayores de 30 ;) » Java »

Más de un return's?

Estas en el tema de Más de un return's? en el foro de Java en Foros del Web. Buenas me he encontrado con la disyuntiva de si es correcto tener en un método varios return's o no.. La duda concretamente es si esta ...
  #1 (permalink)  
Antiguo 18/09/2013, 11:14
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Más de un return's?

Buenas me he encontrado con la disyuntiva de si es correcto tener en un método varios return's o no..

La duda concretamente es si esta bien que un método posea más de un return?, yo he trabajado siempre devolviendo una variable que es seteada dependiendo la lógica del procedimiento y es esta la que devuelvo en un único return, pero he visto varios métodos con varios return y no se si es valido hacerlo, que se puede se puede, pero se debe?

Saludos!!
  #2 (permalink)  
Antiguo 18/09/2013, 11:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Más de un return's?

Esos metodos con varios return es porque poseen condicionales (normalmente if-else) que determinan cual return se realizara, como sabras en el momento en que se hace un return desde un metodo este hace un salto a la ultima linea y sale del mismo, es decir, nunca hara 2 return al mismo tiempo, el return que hagas primero determinara donde termina la ejecucion del metodo.
  #3 (permalink)  
Antiguo 18/09/2013, 11:50
Avatar de seroons  
Fecha de Ingreso: abril-2002
Ubicación: Sevilla
Mensajes: 20
Antigüedad: 22 años
Puntos: 1
Respuesta: Más de un return's?

Lo que hay que tener claro que return puede haber muchos, pero siempre "uno" por condicional, es decir por cada if, o else.
  #4 (permalink)  
Antiguo 18/09/2013, 11:57
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Más de un return's?

Si, tengo claro como funciona el return, pero mi pregunta pasa no por un tema de funcionamiento del método sino si es correcto o no hacerlo, un ejemplo de mi duda...

Ejemplo 1:
Código Java:
Ver original
  1. private boolean sonIguales(String a String b) {
  2.  
  3.         boolean iguales = false;
  4.        
  5.         if (a.equals(b)) {
  6.             iguales = true;
  7.         }
  8.         return iguales;
  9.     }

Ejemplo 2:
Código Java:
Ver original
  1. private boolean sonIguales(String a String b) {
  2.        
  3.         if (a.equals(b)) {
  4.             return true;
  5.         } else {
  6.             return false;
  7.         }
  8.     }

Que beneficios tiene un método sobre otro?, el resultado es el mismo, pero la forma de programar es muy distinta, cual es correcta si es que una lo es?

Saludos

Última edición por diego_g_09; 18/09/2013 a las 12:06
  #5 (permalink)  
Antiguo 18/09/2013, 12:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Más de un return's?

cuando usas varios returns el beneficio viene si usas diferentes variables, por ejemplo

Código Java:
Ver original
  1. if(texto.equals("N")){
  2.    return var1;
  3. else if(texto.equals("Y")){
  4.    return var2;
  5. }else{
  6.    return var3;
  7. }
  #6 (permalink)  
Antiguo 18/09/2013, 12:21
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Más de un return's?

Cita:
Iniciado por CRauda Ver Mensaje
cuando usas varios returns el beneficio viene si usas diferentes variables, por ejemplo

Código Java:
Ver original
  1. if(texto.equals("N")){
  2.    return var1;
  3. else if(texto.equals("Y")){
  4.    return var2;
  5. }else{
  6.    return var3;
  7. }
CRauda, la variable puede ser seteada (una variable general al método) ya que el tipo de dato a devolver debe ser el mismo en los tres casos que estas planteando, por lo tanto para el caso que estas planteando usar diferentes variables no determina el uso de más de un return's o no.. . es más al tener más variables tienes por lo tanto mas memoria utilizada..., la pregunta planteada es muy fina, y es más que nada para saber si es correcto una o otra forma de programar.
  #7 (permalink)  
Antiguo 18/09/2013, 13:21
 
Fecha de Ingreso: mayo-2013
Ubicación: Córdoba
Mensajes: 139
Antigüedad: 10 años, 11 meses
Puntos: 9
Respuesta: Más de un return's?

No, se recomienda tener un solo camino de salida en el método. Si queres le podes poner 25 returns o returns en algun bulce, pero se recomienda que solo tengas un único return.
  #8 (permalink)  
Antiguo 18/09/2013, 13:23
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Más de un return's?

Cita:
Iniciado por cazador1992 Ver Mensaje
No, se recomienda tener un solo camino de salida en el método. Si queres le podes poner 25 returns o returns en algun bulce, pero se recomienda que solo tengas un único return.
Ok, es lo que yo tenía entendido, pero cual es la argumentación?, si no se recomienda tener más de uno por que es que no se recomienda?, performance, prolijidad, etc..???
  #9 (permalink)  
Antiguo 18/09/2013, 13:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Más de un return's?

diego_g_09 Lo que te puse era solo con el fin de ejemplificar, ambas formas son correctas para realizar el return, en el caso de los booleanos es mejor la forma de los 2 return ya que evitas la declaracion de una variable, pero en casos diferentes donde requieres el retorno de variables que no son booleanas te dan el beneficio de poder hacer returns dependiendo de lo que requieras que devuelva, por ejemplo en mi caso tengo estas funciones:

Código Java:
Ver original
  1. private String ejecutaAccion(int accion, String valor,String valor2,String valor3,String Tabla,String Tabla2) throws SQLException{
  2.             String sql = "";
  3.             String valorReturn = null;
  4.             if (accion == 1){
  5.                sql = "SELECT CTIME campo FROM " + Esquema + "." + Tabla + " WHERE CLABRQ IN (select CLABRQ from " + Esquema + "." + Tabla2 + " where cjbcrd='" + valor + "')";
  6.             }
  7.             if(accion == 2){
  8.                 sql = "select ATMPOR campo from " + Esquema2 + "." + Tabla + "  where asplit='" + valor + "'";
  9.             }
  10.             if(accion == 3){
  11.                 sql = "select JESTTM campo from " + Esquema + "." + Tabla + " where JWRKO2= " + valor2 + " and JWRKO1= " + valor;
  12.             }
  13.             if(accion == 4){
  14.                 sql = "select YTMVAL campo from " + Esquema2 + "." + Tabla + " where ysplit ='" + valor + "'";
  15.             }
  16.             try {
  17.                 stmt = as.connection.createStatement();
  18.                 rs = stmt.executeQuery(sql);  
  19.                 while(rs.next()){
  20.                     if (rs.getString("campo") == null || rs.getString("campo").equals("") || rs.getString("campo").equals("null")){
  21.                         return "0";
  22.                     }else{
  23.                         valorReturn = (rs.getString("campo")).toString();
  24.                         if(isNumeric(valorReturn)){
  25.                             if(Integer.parseInt(valorReturn) < 10){
  26.                                 return "0" + valorReturn;
  27.                             }else{
  28.                                 return valorReturn;
  29.                             }
  30.                         }
  31.                     }
  32.                 }
  33.             } catch (SQLException e) {
  34.                 e.printStackTrace();
  35.                 return "ND";
  36.             }  
  37.         }
  38.  
  39.     public boolean isNumeric(String input) {
  40.       try {
  41.         Integer.parseInt(input);
  42.         return true;
  43.       }
  44.       catch (NumberFormatException e) {
  45.         //e.printStackTrace();
  46.         return false;
  47.       }
  48.     }

De no ser por los multiples return tendria que hacer muchas mas cosas para poder obtener lo que necesito segun sea el caso. Espero que con esto se te aclare mejor tu duda. Saludos.
  #10 (permalink)  
Antiguo 18/09/2013, 14:14
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Más de un return's?

Ok, entiendo tu punto, pero no veo porque al caso que expusiste no se pueda sustituir los return por un seteo de una variable String que luego es la que devolverás...
Yo tengo el concepto de como dice cazador1992 " se recomienda tener un solo camino de salida en el método. ", pero porqué?
  #11 (permalink)  
Antiguo 18/09/2013, 14:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Más de un return's?

Como te dije, ambas maneras son correctas, pero entre menos variables crees y menos valores setees menor uso de memoria tendras, es por eso que si te fijas hago return con valores directos, a menos que sea necesario, como en el caso de verificar si es un valor numerico y si es menor de 10 ponerle un cero al inicio, en ese caso si utilice una variable, pero en las demas hago un return directamente con el valor que se refiere a la respuesta obtenida, sino me quedaria de esta forma:

Código Java:
Ver original
  1. private String ejecutaAccion(int accion, String valor,String valor2,String valor3,String Tabla,String Tabla2) throws SQLException{
  2.             String sql = "";
  3.             String valorReturn = null;
  4.             if (accion == 1){
  5.                sql = "SELECT CTIME campo FROM " + Esquema + "." + Tabla + " WHERE CLABRQ IN (select CLABRQ from " + Esquema + "." + Tabla2 + " where cjbcrd='" + valor + "')";
  6.             }
  7.             if(accion == 2){
  8.                 sql = "select ATMPOR campo from " + Esquema2 + "." + Tabla + "  where asplit='" + valor + "'";
  9.             }
  10.             if(accion == 3){
  11.                 sql = "select JESTTM campo from " + Esquema + "." + Tabla + " where JWRKO2= " + valor2 + " and JWRKO1= " + valor;
  12.             }
  13.             if(accion == 4){
  14.                 sql = "select YTMVAL campo from " + Esquema2 + "." + Tabla + " where ysplit ='" + valor + "'";
  15.             }
  16.             try {
  17.                 stmt = as.connection.createStatement();
  18.                 rs = stmt.executeQuery(sql);  
  19.                 while(rs.next()){
  20.                     if (rs.getString("campo") == null || rs.getString("campo").equals("") || rs.getString("campo").equals("null")){
  21.                         valorReturn = "0";
  22.                     }else{
  23.                         valorReturn = (rs.getString("campo")).toString();
  24.                         if(isNumeric(valorReturn)){
  25.                             if(Integer.parseInt(valorReturn) < 10){
  26.                                 valorReturn = "0" + valorReturn;
  27.                             }
  28.                         }
  29.                     }
  30.                 }
  31.             } catch (SQLException e) {
  32.                 e.printStackTrace();
  33.                 valorReturn = "ND";
  34.             }   finally{
  35.                 return valorReturn;
  36.             }
  37.         }
  38.  
  39.     public boolean isNumeric(String input) {
  40.       boolean Numerico = false;
  41.       try {
  42.         Integer.parseInt(input);
  43.         Numerico = true;
  44.       }
  45.       catch (NumberFormatException e) {
  46.         //e.printStackTrace();
  47.        
  48.       }
  49.       return Numerico;
  50.     }


Que al final es lo mismo, pero con mas uso de memoria, imagina un caso real, 600 usuarios conectados al mismo tiempo en el sistema usando los recursos del servidor... entre mas recursos consumas, mas lento se pondra el sistema y mas probabilidades de saturar el servidor tendras. Saludos.
  #12 (permalink)  
Antiguo 18/09/2013, 14:44
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Más de un return's?

Ok, bien esa argumentación me gusta más, y entiendo, para estos casos entonces es mejor el uso de muchos return (poniendonos finos en el uso de la memoria)...

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:52.