programacion-retorno-funciones

Qué es el valor de retorno de una función

Los valores de retorno son un resultado que, opcionalmente, que se puede devolver desde una función. En muchas ocasiones es muy útil devolver este valor para utilizarse en otra parte del programa.

Cuando hablamos de Qué son las funciones, habíamos dicho que una función es un bloque de código que ejecuta una acción. Las funciones tienen, opcionalmente, unos inputs y un output.

programacion-funcion

Varios inputs, un único output

El valor de retorno de la función es el output que, opcionalmente, nos puede dar la función para que el valor que nos devuelve sea usado en otra parte del código

Los valores de retorno son importantes porque nos permiten ampliar más la modularidad y reutilización de nuestras funciones.

En general, se puede devolver un único valor de retorno en una función. Esto es así por la forma en al que funcionan internamente las funciones. Aunque, como veremos al final que es posible “saltarnos” esta restricción.

Ejemplos de return en distintos lenguajes

A continuación vamos a ver algunos ejemplos de cómo hacer un retorno de una función en distintos lenguajes de programación

Para eso usaremos la función de sumar que definimos en la entrada anterior y que se nos había quedado “algo coja”.

Precisamente había quedado “algo coja” porque en el caso de la función suma aunque es un ejemplo muy sencillo tiene mucho sentido que nos devuelva un valor,

En el caso de C, C++, C# y Java el valor de retorno se indica en la definición de la función indicando el tipo de valor devuelto antes del nombre de la función

Después para devolver el valor desde cualquier punto de la función se usa la palabra reservada return seguida del valor que queremos devolver.

// Definición de la función
int Suma(int a, int b) {
  return a + b;
}

// Uso de la función Suma
int resultado = Suma(3, 5);

En el caso de JavaScript lo que es un lenguaje de tipado dinámico no es necesario indicar el tipo de valor a devolver. Únicamente es necesario llamar a la función return desde cualquier punto de la función con el valor que queremos de devolver

// Definición de la función
function Suma(a, b) {
  return a + b;
}

// Uso de la función
var resultado = Multiplicar(3, 5);

En el caso de TypeScript que como recordamos es una versión de JavaScript que introduce tipado estricto vuelve a ser necesario indicar el tipo de retorno de la función en este caso se pone a continuación del nombre de la función separado por :.

De igual forma que en los casos anteriores a lo largo de la función en algún momento tenemos una sentencia de return indicando el valor que queremos devolver.

// Definición de la función
function suma(a: number, b: number): number {
  return a + b;
}

let resultado = suma(3, 5);

En el caso del lenguaje Python es muy similar a los anteriores. Al ser un lenguaje de tipado dinámico no es necesario indicar el tipo de valor que se devuelve. Así que simplemente tenemos que llamar a return en algún punto de la función con el valor que queremos devolver.

// Definición de la función
def suma(a, b):
  return a + b

# Uso de la función
resultado = suma(3, 5)

Por poner un ejemplo de sintaxis un poco diferente en el caso de una función enSQL la sintaxis sería similar la siguiente.

CREATE FUNCTION sumar_numeros(@a INT, @b INT)
RETURNS INT AS
BEGIN
    DECLARE @resultado INT;
    SET @resultado = @a + @b;
    RETURN @resultado;
END;

Nuevamente vemos que aparte de las diferencias por de sintaxis entre distintos lenguajes y las diferencias porque algunos son tipados y otros no tipados, en general, el funcionamiento y el concepto es el mismo en todos los lenguajes

Devolución de múltiples valores

Cómo habíamos dicho las funciones, por lo general, solo es posible devolver un único valor. Esto es así por la forma en la que funcionan internamente las funciones al ejecutarse en el procesador.

Sin embargo, es posible devolver una agrupación de múltiples valores en una estructura de datos y devolverla como valor de retorno.

(int, int) divisionResto(int a, int b)
{
    int resultadoDivision = a / b;
    int resto = a % b;
    return (resultadoDivision, resto);
}

En este ejemplo, la función divisionResto devuelve dos valores: el resultado de la división y el resto. Ambos valores se agrupan en una tupla que se devuelve como valor de retorno.

Algunos lenguajes realizando esta agrupación de forma transparente para nosotros de forma que da la sensación de que se puede devolver más de un valor, pero internamente lo que se está volviendo es un grupo que contiene los valores.

Buenas prácticas y consejos de limpieza Consejos

Elige un tipo de retorno adecuado: Selecciona el tipo de dato de retorno que sea más apropiado para la función y su propósito. Asegúrate de que el tipo de retorno refleje la información que la función debe proporcionar al llamador.

Mantén consistencia en el tipo de retorno: Aunque el lenguaje te lo permita, evita devolver dos tipos distintos de valores de retorno (por ejemplo, un número y un texto). Esto se puede “forzar” en casi todos los lenguajes, incluso en los tipados podemos devolver un objeto. No lo hagas.

Igualmente, mantén un tipo de retorno consistente en funciones similares o relacionadas. Por ejemplo, si tienes una colección de elementos y funcionesgetById o getByName, es conveniente que todas devuelvan el mismo tipo. En este ejemplo un único elemento.

Si necesitas devolver otros tipos usa otra “familia” de funciones, como por ejemplo getAll o getWhere..., si tienes que devolver colecciones de elementos.

Evita devolver valores vacío nulos: El valor de retorno debe tener un significado claro y útil. Evita devolver valores vacíos o nulos cuando sea posible. Si la función no puede producir un resultado válido, considera el uso de excepciones o códigos de error especiales.

Considera el uso de estructuras de datos complejas: Si la función necesita devolver múltiples valores relacionados, considera utilizar estructuras de datos complejas, como tuplas, diccionarios o clases personalizadas.

Un ejemplo típico es la función index_of(), que es una función que devuelve la posición en la que encuentra un elemento en una colección. Es una práctica habitual (y sucia) devolver -1 si el valor no se encuentra. Es mucho mejor devolver una tupla indicando si se ha encontrado el resultado, y la posición.