¿Es mejor un único ‘return’ en mis fuciones?

Hoy me he levantado con ganas de meterme en fregados.

Voy a contaros mi opinión sobre la eterna pelea del «early return» vs «single return».

Muchas veces he oído que se debería usar siempre el single return (tener un único return en la función). Confieso que durante mucho tiempo he pensado que era la opción correcta. Pero un día empecé a cambiar de opinión y ahora estoy firmemente convencido de que el «return early» es la opción más adecuada en la mayoría de los casos.

Me da a mi que mi empecinamiento viene de mis orígenes con el lenguaje C.

¿Qué es eso de «single return»?

Este término se usa para decir que nuestra función tiene un único punto de salida. Un ejemplo para ilustrarlo:

function esNombreValido($nombre)
{
    if (!$nombre) {
        $esValido = self::NOMBRE_VACIO;
    } else {
        if (strlen($nombre) < LONGITUD_MINIMA) {
            $esValido = self::NOMBRE_DEMASIADO_CORTO;
        } else if (strlen($nombre) > LONGITUD_MAXIMA) {
            $esValido = self::NOMBRE_DEMASIADO_LARGO;
        }
        else {
            $esValido = true;
        }
    }

    return $esValido;
}

Cuando veo algo así me empiezo a marear un poco. Si no tuviera test automatizados para validar los diferentes casos me quedaría la duda de si esta función es correcta (es un ejemplo y, la verdad, no me he molestado en probarla).

¿A tí no te marea tanto if-else?

¿Y el «early return»?

Este otro término se usa cuando vamos haciendo validaciones y salimos de la función en los casos incorrectos. Por ejemplo:

function esNombreValido($nombre)
{
    if (!$nombre) {
        return self::NOMBRE_VACIO;
    }

    if (strlen($nombre) < LONGITUD_MINIMA) {
        return self::NOMBRE_DEMASIADO_CORTO;
    }

    if (strlen($nombre) > LONGITUD_MAXIMA) {
        return self::NOMBRE_DEMASIADO_LARGO;
    }

    return true;
}

Este simplón ejemplo creo que ilustra bien la principal ventaja de esta opción; el código es más fácil de entender. No hay tanto if-else mareando.

En el ejemplo anterior no tengo claro si están contemplados bien los casos o si es correcta. Con esta segunda opción de un rápido vistazo me hago una idea clara de lo que pasa.

Por supuesto que habrá casos en los que se puede entender mejor el código usando «single return» ¿Se te ocurre alguno?

Deja un comentario