Anidamiento de sentencias if

kraneok

Hola gente, hoy vengo con una duda de anidamiento y sangrado de las sentencias if.

Programando en PHP, en Symfony2 concretamente me estoy juntando con varias condicionales y estoy probando a escribir el código de una forma diferente a como normalmente lo hago. Ejemplo

Forma normal

if( condicion )
{
     if( condicion )
     {
        -- sentencias --
     }else
         return new Response( msg );

}else
    return new Response( msg );

La que propongo o estoy pensando

if( ! condicion )
    return new Response( msg );

if( ! condicion )
    return new Response( msg );

 -- sentencias --

¿ Como lo veis vosotros mejor ?. Personalmente, de la segunda forma se detecta antes que es lo que devuelve en el msg, es decir, si la condición no cumple rompemos el flujo del programa utilizando un return, el cual conlleva el Response.

En el caso primero, si dentro de los if tenemos mucho código hay que hacer scroll para ver donde acaba y que está haciendo.

B

Por legibilidad te recomiendo que, siempre que puedas, evites poner negados en condiciones. Es bastante mas comprensible y legible el hecho de leer una condición y evaluarla, que no leerla, evaluarla y luego negarla para saber si se necesita entrar o no (a nivel de humano leyendo código).

Si lo que te preocupa es la eficiencia, relájate, son cambios muy menores que dificilmente vas a notar.

1 respuesta
Wasd

Es poco recomendable tener varios returns en una función (hay veces que puede ser inevitable, pero en este caso diría que se puede evitar). Tampoco es bueno usar if's sin brackets (poco mantenible).
Yo haría algo así:

$msg = 'Default message';
if(!condicion){
    $msg = 'A';
}

if(!condicion){
    $msg = 'B';
}

 -- sentencias --

$msg = 'OK';

return new Response($msg);

En caso de que --sentencias-- no devuelva un Response, puedes meterlo en un else if(). Entonces ya te obligarías a meter dos tipos de returns distintos en una misma funcion. En tal caso haz una nueva función para el nuevo return.

2 respuestas
kraneok

#2 #3 Gracias por las respuesta, en realidad casi que veo mejor utilizar la forma normal y así de este modo, con el sangrado, el código es bastante mas legible.

Muchas gracias a ambos

Gantorys

yo iniciaría la variable $response con lo del else, así te ahorras el else del final. Lo que dice #3 básicamente pero iniciando $msg con el valor 'ok'

Usuarios habituales