elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda, mala práctica?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda, mala práctica?  (Leído 3,342 veces)
n-utz

Desconectado Desconectado

Mensajes: 165

Babylon es el vampiro!


Ver Perfil
Duda, mala práctica?
« en: 9 Diciembre 2017, 23:51 pm »

Buenas,

Vengo con una duda, estoy haciendo un programa para la facultad, nada complicado. No es más que un ABM, por eso lo estoy haciendo bastante 'rapido', es decir, sin mucha dedicación solo para recordar Java.

En un método me encontré con lo siguiente, hice esto para simplificar:

Código:
	private Producto traerProducto(int idProducto)
{
for(Producto prod: this.lstProducto)
{
if(prod.getIdProducto() == idProducto)
return prod;
}
return null;
}

En una lista de productos, busco un producto por id. Si lo encuentra retorna el producto, si no, null.
Mi duda es si es una buena o mala práctica utilizar múltiples return's en un mismo método. Yo lo hice para ahorrarme la variable flag.

Esta duda me surgió porque recuerdo haber visto en un analizador de código que cuándo tenía múltiples return's debía simplificarlo. Pero acudo a ustedes a ver que me dicen.

PD: Capaz haga una prueba de rendimiento (solo velocidad, aunque sospecho cual ganarà).


En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Duda, mala práctica?
« Respuesta #1 en: 10 Diciembre 2017, 01:24 am »

Pues en lo personal no hay mucho problema, aun asi puedes usar otra alternativa al famoso foreach y  en su lugar usar streams

Código
  1. import java.util.List;
  2. import java.util.Optional;
  3.  
  4. public class Main
  5. {
  6.  
  7. public static void main(String args[])
  8. {
  9.  
  10. List<Product> products = new ArrayList<>();
  11. products.add(new Product(10));
  12. products.add(new Product(2));
  13. products.add(new Product(4));
  14.  
  15. long id = 3;
  16. Optional<Product> value = products.stream().filter(p -> p.getId() == id).findFirst();
  17.  
  18. if (value.isPresent())
  19. {
  20. System.out.println("The number found is " + value.get().getId());
  21. } else
  22. {
  23. System.out.println("The number can't find");
  24. }
  25. }
  26. }
  27.  
  28. class Product
  29. {
  30. private long id;
  31.  
  32. public Product(long id)
  33. {
  34. this.id = id;
  35. }
  36.  
  37. public long getId()
  38. {
  39. return id;
  40. }
  41. }


En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Duda, mala práctica?
« Respuesta #2 en: 10 Diciembre 2017, 02:52 am »

Pues en lo personal no hay mucho problema, aun asi puedes usar otra alternativa al famoso foreach y  en su lugar usar streams

Código
  1. import java.util.List;
  2. import java.util.Optional;
  3.  
  4. public class Main
  5. {
  6.  
  7. public static void main(String args[])
  8. {
  9.  
  10. List<Product> products = new ArrayList<>();
  11. products.add(new Product(10));
  12. products.add(new Product(2));
  13. products.add(new Product(4));
  14.  
  15. long id = 3;
  16. Optional<Product> value = products.stream().filter(p -> p.getId() == id).findFirst();
  17.  
  18. if (value.isPresent())
  19. {
  20. System.out.println("The number found is " + value.get().getId());
  21. } else
  22. {
  23. System.out.println("The number can't find");
  24. }
  25. }
  26. }
  27.  
  28. class Product
  29. {
  30. private long id;
  31.  
  32. public Product(long id)
  33. {
  34. this.id = id;
  35. }
  36.  
  37. public long getId()
  38. {
  39. return id;
  40. }
  41. }

Es verdad con java8 el performance se incrementa mucho, por lo tanto es mejor...

@crack81 sabes como extraer el index con stream?

saludos



Edito:

Para Array de primitivos, retorna -1 si no esta, de lo contrario el preciado index  >:D

Código
  1. private static final int NUM[] = {3,10,6,1,4,8,2,5,9,7};
  2. public Stream_17_3() {
  3.        init();
  4.  
  5.        final int n = $$_Gaag_77(NUM,10);
  6.        if(n != -1) {
  7.            JOptionPane.showMessageDialog(null,"Index: "+n);
  8.        }else {
  9.            JOptionPane.showMessageDialog(null," ;( ");
  10.        }
  11. }
  12. private static int $$_Gaag_77(final int[] array, final int $_TghY) {
  13.        return IntStream.range(0, array.length)
  14.                .filter(index -> array[index] ==  $_TghY)
  15.                .findFirst()
  16.                .orElse(-1);
  17. }
  18.  

« Última modificación: 10 Diciembre 2017, 04:11 am por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Duda, mala práctica?
« Respuesta #3 en: 11 Diciembre 2017, 17:19 pm »

La solución de un problema dado puede aparecer en cualquier punto dentro de una función.
En general si se sale de una función desde "cualquier" parte, el único problema que presenta es que para "ojos ajenos", pueda ser más difícil de leer...

Entonces si programas para tí, haz lo que te venga en gana según tu criterio, y si programas para una empresa, sométete a la regla que allí sigan.

En cualquier caso, la salida se puede diferir siempre al final de la función de modo que allí se resuma la devolución.

Código:
entero = funcion X(entero p)
   Si p=5
       devolver p+2
   OSi p<0
       devolver 0
   Osi p>129
       devolver 32
   Osi p=51
       devolver Sumatorio(p/3)
   Sino
       devolver p
   Fin si
Fin funcion

La función previa de ejemplo tiene varias salidas, pero todas pueden cosiderarse finales, por cuanto tras cada devolución, no hay más código que se fuera a ejecutar. Aún así los puristas prefieren siempre 1 o a lo sumo dos devoluciones, en tal caso puede modificarse como sigue:

Código:
 entero = funcion X(entero p)
   entero y

   Si p=5
       y= p+2
   OSi p<0
       y= 0
   Osi p>129
       y= 32
   Osi p=51
       y = Sumatorio(p/3)
   Sino
       y= p
   Fin si

   devolver y
Fin funcion
Para mi, no gana en claridad, tampoco en velocidad, ni en ahorro de memoria, aunque si que puede ganar en mantenimiento si en un futuro hubiese de sufrir cambios (en general), al final sigue devolviendo, lo que sea que previamente se haya calculado-considerado. Cuando el código tiene a ser complejo es cuando suele resultar de más interés, peor especialmente si otros han de leer tu código (o si a tí mismo resulta complicado leerte pasado el tiempo, que les pasa a muchos).
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines