NO Uses "IF" anidados. HAZ esto!

He visto muchos hilos en el foro con casos similares, me pareció muy adecuado para quien comienza a programar y se topa con este problema
No olvidar que una alternativa a los if anidados sin la parte negada es el switch case que resulta mas simple de entender pero que solo sirve en determinadas situaciones.

1 Like

Está equivocado ese código, no se obtiene el mismo resultado con el código original que con el código corregido.

O sea, "está más limpio" pero porque es erróneo. :crazy_face:

Si solo hubiese puesto unos return la cosa cambiaba... :man_facepalming:t2:

Equivocado no, no hará todo lo que hacia el inicial pero equivocado es fuerte como palabra.
Luego lo pruebo, a mi me pareció interesante. Algo simple.
Voy a prestar atención a tu punto de vista @anon90500195.

void showUserDashBoard() {
   Serial.println("Usuario okay.");
}    

void DoAnidado(int isUserActive, int isUserSubscribed, int isPaidUser) {
   Serial.println("If anidados");
   if (isUserActive)
      if (isUserSubscribed)  
         if (isPaidUser)
            showUserDashBoard();
         else
            Serial.println("Not a pro user");
      else
         Serial.println("User not Subscribed");
   else 
      Serial.println("User not active");

}

void DoGuardClauses(int isUserActive, int isUserSubscribed, int isPaidUser) {
   Serial.println("If con Clausulas de Guarda");
   if (!isUserActive) {
        Serial.println("User not active");
        return;
   }
   if (!isUserSubscribed)  {
      Serial.println("User not Subscribed"); 
      return;
   }
   if (!isPaidUser) {
      Serial.println("Not a pro user");
      return;
   }
   showUserDashBoard();   

}

void setup() {
  
  Serial.begin(115200);
  Serial.println("If anidados\n");
  //        isUserActive isUserSubscribed isPaidUser) {
  Serial.println("\nUsuario que cumple todas las condiciones");
  DoAnidado(true, true, true);
  DoGuardClauses(true, true, true);

  Serial.println("\nNo es usuario de Pago");
  DoAnidado(true, true, false);
  DoGuardClauses(true, true, false);

  Serial.println("\nNo es usuario subscripto");
  DoAnidado(true, false, true);
  DoGuardClauses(true, false, true);

  Serial.println("\nNo es usuario Activo");
  DoAnidado(false, true, true);
  DoGuardClauses(false, true, true);
}

void loop() {

}

Sin el agregado de los return fallaba la idea pero sigue siendo muy simple y más fácil de ver para mi gusto.
Como no lo probé no visualicé la falla, pero @anon90500195 tenías razón.

En realidad me apresuré en mi apreciación, no es que esté errado el código, es que tal y como está el ejemplo del video no aplica a arduino porque no tenemos disponible la sentencia Exception() por lo tanto hay que forzar de alguna forma la salida del if().
Resumiendo, no está mal pero no aplica a arduino a menos que se modifique.

Eso desde ya. Eso viene de Visual C++ según creo.

Bueno ahi lo apliqué y realmente luce mucho mejor.

Este código tampoco es del todo correcto, porque conduce a una advertencia "return statement in function declared void" :slight_smile:
Sería más lógico para guarda función si devolviera el estado de prueba de condición: verdadero o falso o un código de error.

Pero en general, estoy de acuerdo con el autor en que este código es más limpio y correcto. Este principio de organizar las condiciones es bien conocido, lo uso a menudo.

Este error es mío. Te doy la razón @b707!
En realidad yo vi de casualidad el video de Youtube y me pareció interesante para los que comienzan a programar y luego agregué un código simple.
@anon90500195 me hizo la observación que estaba mal y lo comprobé haciendo todas la pruebas posibles para que se viera que funcionaba y claramente respecto a mi código del post#1 faltaba algo. Como me sugirió el return lo puse pero claramente tendría que cambiar el voy por bool y devolver algo.

No me justifico pero ni IDE ni Platformio me arroja la advertencia que señala @b707.
Como lo tienes seteado?

Para este tipo de cosas, sobre si el código es bien largo, de toda la vida se usa el Switch (case). Para eso en su día lo inventaron.

Disculpad por subir, pero me encantan este tipo de conversaciones.
Yo pongo otro punto de vista diferente sin usar ni un "if":

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.