21 de septiembre de 2018

Métodos con retorno

Hasta ahora hemos declarado sólo métodos sin retorno (void methods) porque en la parte del resultado al definirlos siempre hemos usado la palabra reservada void.

Desde esta entrada vamos a empezar a hacer cosas más chulas ya que veremos los métodos con retorno (value methods), los cuales sólo difieren de los void en dos aspectos de su declaración:
  1. Declaran el tipo del valor que devuelven
  2. Utilizan la palabra reservada return para indicar el fin de la ejecución del método y devolver el valor. Cualquier código posterior en su ámbito no se ejecutará.
Los métodos con retorno declaran el tipo del valor que devuelven con la sentencia return que finaliza su ejecución


No se puede declarar un método con retorno sin estas dos modificaciones. De hecho nuestro IDE nos alertará de que falta la sentencia return si le indicamos un tipo de retorno pero no la hemos añadido para salir del cuerpo.


Esta diferencia implica unos cambios importantes:
  • Ahora los métodos value nos pueden devolver un resultado con el que podemos trabajar tras su ejecución.
  • Los cambios que generaban los métodos void se hacían sobre algún elemento externo (como hicimos con la consola añadiendo líneas). Esto se conoce como efectos colaterales (side effects) y va en contra de la programación funcional (functional programming).
  • La programación funcional es coherente ya que una invocación con los mismos argumentos siempre nos producirá el mismo resultado.
  • Es una buena práctica programar lo que podamos de esta forma para reutilizar más nuestro código y mejorar el mantenimiento (pues es mucho más fácil de depurar).

Los métodos con retorno producen valores con los que trabajar después y facilitan la programación funcional


Empecemos con un ejemplo sencillo:
    public static double suma(double a, double b) {
        double suma = a + b;
    
        return suma;
    }
Este código admite dos argumentos de tipo double y devuelve su suma. También es válido simplemente con:
    public static double suma(double a, double b) {
        return a + b;
    }
Ya que la variable suma no la necesitamos localmente y sólo necesitamos devolver el valor de la expresión a + b. En vuestros primeros códigos no tengáis pegas en añadir variables innecesarias si os va a servir para ir comprobando paso a paso que vuestro código funciona correctamente. Lo vamos a ver en la práctica de esta sesión, pero antes ¿Os atrevéis a hacer un método que reste los dos valores?


    public static double resta(double minuendo, double sustraendo) {
        double resta = minuendo - sustraendo;
    
        return resta;
    }
Si habéis dejado los nombres de a y b, sería conveniente dejar claro cuál es el minuendo y cuál el sustraendo pues no es una operación conmutativa. Cuanto más claros sean los nombres de los parámetros más fácil será usarlos.

Vamos a ver otro ejemplo típico: preguntar por un boolean. Cuando trabajemos con objetos será normal preguntar si es/estaAlgo (imaginad un objeto con color que puede ocultarse, podríamos preguntar si estaOculto o si esVerde).

Veamos este código:
    public static boolean esPositivo(double numero) {
        return numero > 0;
    }
El método esPositivo nos devolverá true si es mayor que cero, si no devolverá false. El nombre de este tipo de métodos siempre lo expresaremos en positivo (mejor esPositivo que noEsPositivo, eso lo expresariamos como !esPositivo)

Intentad hacer ahora uno que nos diga si un entero es par.


    public static boolean esPar(int numero) {
        int resto = numero % 2;
    
        return resto == 0; // Resumiendo sería "return (numero % 2) == 0;"
    }
Hay que fijarse que el tipo del parámetro es más adecuado que sea int y la forma más sencilla de calcularlo es usando el operador % para ver si el resto es cero.

Vamos a expresar los nombres de los métodos en positivo y con nombres de argumentos lo más claros posibles


Para terminar vamos a ver una práctica más larga que nos aporta el libro en la que tendréis que ir comprobando paso a paso que todo está saliendo bien, reutilizar todo el código que podáis y que sea funcional.

Práctica:

En el vídeo he ido haciendo paso a paso este método.


public static double area(double xc, double yc, double xp, double yp) {
    double area;
    double radio;
    
    radio = distancia(xc, yc, xp, yp);
    area = Math.PI * cuadrado(radio);
    
    return area;
}

private static double cuadrado(double radio) {
    return radio * radio;
}

private static double distancia(double xc, double yc, double xp, double yp) {
    double distancia;
    double sumaDeLosCuadrados;
    double cuadradoX;
    double cuadradoY;
    double restaX;
    double restaY;
    
    restaX = resta(xc, xp);
    restaY = resta(yc, yp);
    cuadradoX = cuadrado(restaX);
    cuadradoY = cuadrado(restaY);
    sumaDeLosCuadrados = suma(cuadradoX, cuadradoY);
    distancia = Math.sqrt(sumaDeLosCuadrados);

    return distancia;
}

No hay comentarios:

Publicar un comentario

Compárteme

Entradas populares