NO Uses IF anidados. HAZ esto!
HTML-код
- Опубликовано: 11 сен 2024
- En este video voy a mostrarles como el uso excesivo de IF anidados es una mala práctica y como podemos corregirlo usando esta técnica llamada guard clauses o clausulas de guarda.
Esta técnica permite una escritura de código más limpia y legible.
Gracias a @FlutterMapp por la inspiración y apoyo:
• Nesting "If Statements...
Únete a este canal para obtener acceso a todos los LIVES pasados.
/ @diegoveloper
Contenido exclusivo para miembros:
• Members-only videos
🔵 Sígueme:
/ diegoveloper
/ diegoveloper
/ diegoveloper
github.com/die...
diegoveloper.com/
📌 Playlists
- Flutter Animations Tutorial
• Animaciones en Flutter
- Flutter Challenges
• Flutter Challenges
- Flutter Tips - 1 minute:
• Flutter Tips - 1 minute
✅ Coaching/Asesorías
www.buymeacoff...
💻 My Setup:
Standing Desk: amzn.to/39HLvut
Anti Fatigue Standing Desk Mat: amzn.to/3thoaZM
Monitor: amzn.to/36wQy0c
Monitor Arm: amzn.to/3r3J5h0
Macbook Arm: amzn.to/3acOvzq
Macbook Tray: amzn.to/3r7dBXm
Macbook Vertical Stand: amzn.to/3NqQl11
Dock All in one: amzn.to/3yP9FQv
Webcam: amzn.to/3qfILMf
Camera: amzn.to/3HeeV2P
Camera Mic: amzn.to/2MdxVaC
Speakers: amzn.to/2YAqFrY
MultiPort Adapter USB-C: amzn.to/2N98rLP
Phone Holder: amzn.to/379BmGv
Headphones: amzn.to/2YzUE39
Keyboard: amzn.to/3qkMsA8
Wood Keyboard Tray: amzn.to/3cJRrXl
Microphone (current): amzn.to/3i5GyQC
Microphone (old): amzn.to/3rbAVD9
Microphone Stand: amzn.to/3rLfhpx
Mouse Logitech: amzn.to/3cpVFDc
Mouse Pad Razer: amzn.to/2MHvDjV
Mouse Mat Desk Logitech: amzn.to/3G0knFi
Strip Lights: amzn.to/36w0F5x
Main Light: amzn.to/3yU359y
Secondary Lights: amzn.to/2UbNpzY
Goku Figure: amzn.to/36tjx4X :v
Chair (Herman Miller): • La MEJOR SILLA de ofic...
Gracias por ver este video, espero que ayude a los estudiantes de programación, ciencias de la computación, desarrolladores, etc.
Esto aplica a cualquier lenguaje de programación, no solamente Dart en Flutter.
Diego to the moon! 🔥🔥🔥 Wish you the best with this video 🚀
thanks for the inspiration/idea and everything haha, :)
Excelente vídeo. Lo que sí, yo no diría "está mal" 0:08 Yo diría "ineficiente" pero mal no está.
no es ineficiente, es poco legible, son dos cosas diferentes
No es ineficiente, es ilegible. Y pudiéndolo hacer legible lo convierte en código mal hecho.
@@almogaverXIII Aun sigue siendo legible... simplemente no esta tan limpio pero ilegible no es.
Es ilegible para simples mortales
Esta mal dentro del contexto de la sintaxis
Vaya, a veces uno implementa cosas que según nosotros en ese momento es mera cuestión de comodidad, luego va y resulta que tienen un nombre técnico 🤣🤣🤣
Buen video.
x2 llevo toda la vida haciendo las cosas así y ahora me entero de que existe un nombre para ello jaja
Lo tomaste de otro video en inglés, creo haberlo visto hace no mucho. De igual manera es bueno recordarlo y mas difundirlo en nuestro idioma. Saludos !
Eso mismo me percate 🧐
Sii, que observadores xd, Flutter Mapp me dió el permiso para basarme en su video.
Pero eso es como decir que le copiamos el syntax a Dennis Ritchie, del lenguaje C, son practicas conocidas por muchas razones.
lo querían quemar y les cerró la boca xd
@@ProyectoGD literal jaj
chevere si tiene sentido porque las excepciones tienen la cualidad de frenar toda la ejecución del codigo cuando existe algún error buen método.🤗
Esto era lo que me hacía falta, jajaja gracias bro
Justo tenia esa duda, y yo pensando que estaba mal porque ejecutaría la función de todas formas
@@neolymoreno3256 Si de hecho se recomienda mayormente las excepciones que los propios condicionales porque fuerzan el código a diferencia de los condicionales que se solo ejecutan cuando se cumple una condición es decir si hay cierta informacion que no puede ser procesada por el código salta la excepción ignorando el código restante. Es un gusto ayudar a la comunidad.
Eso lo estudié en Estructura de Datos. Así el código corre más rápido cuando tiene muchos datos sobrecargándolo
Tan sencillo que era y nunca lo vi de esta manera, muchas gracias :D
También podemos usar Switch Statement y optimizar aun más la ejecución de nuestro código, debido a que solo necesitamos una variable para movernos por el índice de opciones a comparar. No es lo mismo que un "if", pero no deja de ser una máquina de estados que según en que estado se encuentre la variable de control, pues ejecuta una acción u otra.
Y dependiendo del lenguaje, puedes quitar los {} , como:
if(!isUserActive)
throw Exception(''User not active')
Empecé a usar esto hace tiempo y definitivamente es un gran consejo para escribir código legible y escalable 👌🏻😎
y ahora con un debugger en vez de tener que entender el codigo, directamente me salto 3 instrucciones jne y soy usuario activo, pro y suscrito solo con cambiar un puntero. Gracias por la increible recomendacion de como no hacer software seguro!
Incroyable.
@@mamneo2 :V
llevo haciendo esto por años y no sabía que tenía un nombre. solo que, exactamente como explicaste, es muy sencillo leer el algoritmo de esa forma. nunca pude explicar bien por que me gusta asi. ahora ya se w decirle a mis compas
Ademas de mas limpio, escuche que el procesador tiene que esperar para ver que es elegido, y haciendo operaciones constantes ayuda la velocidad del programa. O(1)
Buen video! Simple y claro!
Si no quieres arrojar excepciones tambien podrías hacer return cuando quieras salirte del método.
El return rompería la ejecución de esa función?
Si
Buenas Diego! Tengo un tema del que podrías hacer un video corto que podría ayudar a muchos. Es el error: 'Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active'. Estaría bueno poder entender bien como solventarlo y entender bien el concepto de "mounted" y cuando usarlo y cuando nop. En mi caso me aparecio en muchos momentos, incluso en navegaciones sin controllers o setStates.
Corto, cómodo y fácil de entender esto si es un tutorial
Muy buen tips! Muchas gracias! Ya mismo lo voy a implementar en mis proyectos!
Estuve pensando que podrías hacer algún video de 5 o 10 minutos de como escribir mejor código en dart. Por ejemplo usar más late en las variables, o más el operador ? en las varibles y objetos y no usar tantos if preguntando si es null la variables para luego hacer algo. Creo que eso tips nos servirían mucho a los que estamos todo el día con dart.
Estoy de acuerdo. Las cláusulas de guarda son una técnica útil para mejorar la legibilidad del código y evitar las condiciones anidadas. En lugar de tener una larga cadena de condiciones, se puede usar cláusulas de guarda para validar pre-condiciones y, en caso de no cumplirse, lanzar una excepción temprano. Esto permite una traza más clara de la lógica y hace que el código sea más fácil de entender y mantener. Además, también ayuda a reducir la posibilidad de errores y bugs en el código.
Ya lo sabia (se ve mas bonito pero es mas lento), gracias por compartir conocimiento.
Muchas gracias, si cuando empecé a programar usaba esos if else, ahora ya no tanto y dependiendo de como hasta uso los switch case :)
Muchas gracias por tu vídeo!!
Hay una construcción que está en casi todos los lenguajes y también puede servir en casos parecidos para dejar el código incluso más limpio: el switch case. En algunos lenguajes,como c, incluso se permiten expresiones en los case.
si, uno tiene a no usar switches pero suelen resolver situaciones que requieran usar muchas condiciones
prueba rust, con los match (switch) casi nunca debes usar los if, y es muchisimo mas seguro
No se trata que los IF anidados sean mala práctica, ocurre que el ejemplo que expones está intencionalmente confuso. Es muy común el uso de códigos anidados en los IF y sobre todo en los ciclos. Los programadores con tiempo y práctica van descubriendo como ir optimizando el código y depende caso a caso. En particular, si el programador tiende a complicar el uso de los IF, es que le falta compreder el uso correcto de los operadores lógicos y pulir el razonamiento en álgebra de Boole.
No me parece que funcione en cada situación, les digo por qué.
En el primer caso, si no se valida el primer if, nunca se va a llegar a la parte del codigo de adentro, en este caso, otros if.
En el segundo caso, si no se valida el primer if, de igual manera se va a llegar al resto del código.
Entonces suponiendo que el usuario no es activo, no está suscrito y no es ProUser:
En el primer caso, las excepciones serían solamente 'Not a pro user'
En el segundo caso, las excepciones serían 'User not active', 'User not subscribed' y por ultino 'Not a pro user'
Corríjanme si estoy equivocado.
Edit: no tiene sentido lo que dije, no conozco el lenguaje
El throw Exception rompe la ejecución, ya no continúa
@@diegoveloper Jajaja lo sientooo, pensé que era otra cosa, no conozco ese lenguaje
@@andreslugo9947 excelente, tenia la misma duda, ya comprendi gracias a esta explicacion.
Gracias, héroe. Entendí con tu comentario jajajaja. Tonto no es el que pregunta , si no el que se queda con la duda 😄
justo iba a decir lo mismo
La verdad es que para una condición siempre pensamos en cumplir la condición y no cumplirla no es un pensamiento normal .. pero OJALA hubiera visto antes este video .. tengo muy poco aplicando esta técnica ..
Lo que hizo fue reescribir una función que hace una lógica AND como una lógica NOR a la que le niega las entradas, obteniendo la misma tabla de verdad al final. O sea se cumplen las mismas conexiones en ambos casos.
Amigo haz un curso de java creeme que ayudarias mucho a la comunidad que pasa por profesores que solo "enseñan" pero sin vocación.
Una maravilla de explicación. Conciso y al pie, muchas gracias Diego! Bendiciones!
Bravo eres el primero que enseña Defensive Coding.
Pocos saben usarlo.
Pienso que serviría sí tienes excepciones cosa que no siempre sucede. Allí me parece más limpia la anidación
Excelente explicación, al grano y sin rodeos
Muy buen video, se agradece que hagas un ciclo sobre buenas prácticas o estilos de programación.
Saludos.
simple y bueno, no sabía su nombre... CRACK
1:38 Corregime si es que estoy mal. El comando "showUserDashboard" en el primer método se ejecuta si las TRES CONDICIONES SON VALIDAS; mientras que en el segundo método se ejecuta siempre al finalizar las condiciones sin importar si son validas o negadas. Aunque el método esta bien, la ejecución de los códigos no son DOS FORMAS CON UN MISMO OBJETIVO sino que son dos códigos con diferentes funciones. En el segundo código deberíamos buscar una manera para que se siga cumpliendo la condición de mostrar "showUserDashboard" una vez las tres funciones son validas.
PD: Repito, si me equivoco corregime. A primera vista es la manera en la que veo que funciona este código. Intentare codificarlo para ver si me equivoco en el proceso.
El throw Exception rompe el ciclo de ejecución
@@diegoveloper Como seria eso? Terminaria con el procedimiento directamente?
@@yukariakiyama3059 si, revisa sobre Excepciones, todos lenguajes de programación lo soportan
Excelente video, directo al punto sin tanto rollo
Haddooouuukkkeeeennnn
es mi técnica de programación favorita, y eso que llevo casi 20 años escribiendo código fuente 😗
Podríamos usar un else -if, en ciertas situaciones no?
Buenísimo!!! Recién estoy empezando así que me viene super el consejo. Muchas gracias :)
Es una técnica que uso desde hace más de 20 años (lenguajes bien viejos). No sabía que alguien se adjudicó autoría y le puso nombre.
Bueno, también se puede usar en positivo en todo caso, sólo usa los conectores adecuados y ya.
Aun recuerdo cuando una vez me dijeron que las Guard clause ya no se usaban que eran anticuadas 😆 cuando el código queda mas fácil y las guard clause apoyan mucho el fail fast principle
Esto no se me hubiese ocurrido, es muy ingeniosa tu solución. Nuevo sub con la campana activada.
Gracias Diego, me ha gustado el vídeo, saludos :)
primer video tuyo que veo un genio total
¡Increíble!
Hay mucha gente que programa esas aguilitas incluso llegando a más de 10 niveles de indentación.
Excelente Diegote , hoy me estaba enredando bastante en el laburo
Excelente video, muy bueno y bastante ilustrativo, gracias! 😁
Se podría limpiar más sacando la llaves de los Ifs ya que es una sola línea. Excelente saludos!
pensé que ibas a tirar un switch o usar ternarios o algo así, pero me gustó el resultado, queda muy prolijo
Esta bueno, pero solo es aplicable si tienes una sola funcion principal a la cual quieres llegar dentro de los ifs. Porque si tienes muchos ifs y cada combinacion de ifs y else requieren ejecutar una funcion distinta, no veo otra forma de seguir haciendo ifs anidados, o realizar if con varias condiciones en la misma linea
Me encanta como se ve el código así de ordenado y claro, y no un código hadouken
Sabían que en la programación orientada objeto, los condicionales sólo debe usarse un caso modulares (como en el ejemplo mostrado) y no procesamiento.
Corrigeme si estoy equivocado. No conozco el lenguaje. 1) La primera logica es mas larga pero mostrara un error a la vez; es decir si el usuario no cumple con las 3 condiciones a la vez. Solo se mostrara o subscrito, o activo o pago. 2) La segunda logica es mas corta pero mostrara los 3 mensajes de errores en caso de cumplirse todos a menos que instruccion throw haga un salto. Concluyo que depende de lo que queramos adaptamos el codigo. Saludos....
hola, el throw Exception rompe el ciclo de ejecución, ya no evaluará las demás condiciones
No es bueno dejarla por defecto al final en este caso, por que por alguna mala configuración de seguridad puede dar acceso.
muy buenos consejos
lo aprendí a la mala cuando en el trabajo me pidieron pasarle el SONARLINTER al proyecto
mee encanto! Salute desde Arg!
Increíble cuando vi la miniatura del video pensé que se iba a utilizar algo diferente al if, pero solo fue el if digamos al revés.
imagino que en este caso que ninguna condicional debe validar nada por el lado negativo? porque que pasa si debes efectuar alguna validacion por ejemplo si el usuario no esta activo?
No sean dogmaticos. Las guard clauses son un patrón, y por lo tanto tiene pros y contras. No todo código puede ser mejorado al usarlas.
muy buena explicacion gracias
Buenisimo, para poder sacarse la costumbre de hacer un laberinto de if jajaj
Sencillo, potente... Perfecto.
Breve y super util. Tome su buen like hombre
Si sigues necesitando un else... Aunque a lo mejor tu código funciona de una forma diferente y si funciona bien. Teóricamente si necesitas ese else para encapsular bien ya que estas suponiendo que lanzar el exception impide lanzar el show pero 'y si no'... Mejor deja el else al final para que se ejecute específicamente cuando ya las condiciones si o si no se ejecutaron. Es también como la diferencia entre else if y if. Si pones dos if se ejecutan los dos si tener en cuenta el uno del otro. Pero si pones un if y luego un else if se ejecutará uno de los dos o ninguno.
En realidad no supongo nada, el throw Exception o el lanzar excepciones, siempre rompen el ciclo de ejecución
Creo que llevas razón, perdona. Tengo que repasar este cuatri las excepciones en una asignatura que tengo. No sé porqué mi mente imagino que era algo propio de tu código y no algo nativo del lenguaje. Por eso creí esa suposición, gracias.
@@jucls2002 no hay problema, el lanzar excepciones debería funcionar igual en los distintos lenguajes, solo que tiene distinta sintaxis seguramente
Video clave, muy bueno!
Nunca lo había pensado. Muy buen dato.
Excelente diego gracias por compartir conocimiento, saludos
Muy bueno! Gracias, a aplicarlo!
gracias Diego!
Fantástico, lo hiciste tan sencillo
te dejo un super me gusta !gracias
Esto sirve para los casos.. Pero igual, buen aporte!
Entiendo el concepto y es muy bueno, pero puede ser que el código nuevo que se muestra en el video no ejecuta las mismas acciones que el primero?
Para este ejemplo debería ser el mismo resultado
Si, pero el chiste no es que ejecute o no ejecute lo mismo, es que sea más legible el código 👨🏿💻, código smells
Videazo!!!!!!
Joder, tras de hacer calistenia, también programa. Que grande Kass
Excelente, me suscribo 👍
diego, te sigo por el thumbnail que te mandaste 🤣, Grande @diegoveloper!
Ufff. Que recuerdos...no les pasó que por probar el codigo y hacerlo rapido...despues lo "arreglo"
Si usas calculo proposicional, podrás hacer todas esas condicionales en una sola, porque una condicional es una proposición lógica
El tema es realizar una determinada acción de acuerdo a una condición
showUserDashboard no se estaría ejecutando siempre que llamamos a la funcion doSomething ?? Es decir.. si se cumple el primer if negado, showUserDashboard se ejecutaria igual ?
El throw Exception rompe el ciclo de ejecución
Soy programador basico y algunas cosas no entiendo, o no vi, siempre se aprende algo, perooo mi pregunta es. el "Throw"....clausula es com o un break de funcion?. o un corte de control, que lo que hace es parar todo y decir, solo te muestro eso, o para que serviria?
El throw exception termina el ciclo de ejecución, ya no se ejecuta lo que sigue del código, también se podría usar return
Está genial, lo había hecho a veces sin darme cuenta, pero en este caso si ocurre algún error y muestra un mensaje, la última función se ejecuta igual o no?
no, se rompe el ciclo de ejecución
No, si no cumple uno de ellos sale del método.
Es un método más viejo que el hilo negro. No sabía que lo habían bautizado.
De todas maneras, es un excelente ejemplo para las nuevas generaciones.
muy bueno el video! me suscribo, ojala saques mas videos como este
Me gusto bastante muy bueno
Perdón por la corrección, pero no es un diseño correcto.
La función que planteas está realizando dos cosas diferentes: chequear la condicion, y hacer algo.
Lo correcto sería:
void doSomething() {
if (canDoSomething()) showUserDashboard();
}
no entendí, compara el antes y después, ambas ejecutan lo mismo, ojo que el throw exception rompe el flujo de ejecución
Me encantó el tip, muchas gracias bro
osea practicamente en las clausulas ifs validamos el else y si no se cumple ningun else lanzamos el metodo.
Yes, y eso rompe la secuencia y no evalúa las otras condiciones
¡Gracias!
También un elif podría ser útil!
¡Qué buen truco! Quisiera preguntar: ¿en vez de poner exclamación y paréntesis a la condición no es más fácil escribir "if not"? Gracias.
Depende del lenguaje de programación, en este caso era Dart
@@diegoveloper Disculpa, es la costumbre de ver tantos videos de Python 😅 ¡Gracias!
Cabe destacar que se debe agregar return para que al final la función showUserDashboard() no acabe ejecutado
Sino estoy mal, al momento de lanzar la excepción, el sistema detiene la ejecución del método, prácticamente es un return pero más violento.
correcto, como dice Jhoan, el throw Exception rompe el ciclo de ejecución
gracias me sirvio mucho, algun tip para las consultas SQL que son de un kilometro? Yo las parto en multiples lineas pero supongo eso no es buena practica xD
quizás pasarlo a vistas o store procedures
Pasarlas a varias líneas no es una mala practica, es mas, es aconsejado.
No es mejor poner compuertas and (&&) a los if en lugar de hacer esa cosas? De allí se ponen condicionales cuando algo se cumple y cuando no porque así (como el vídeo, el código que según mejoraste) lo que haces es que se cumpla algo por cada una de las cosas que no se cumplió pero antes de la supuesta mejora hacía una sola cosa con base a un orden jerárquico de lo que se cumple y lo que no, es decir son diferentes las funciones que hacen los códigos los que muestras en el vídeo, que bien pudiste usar else if para ello.
Puedes plantearlo aquí, como lo harías basado en el ejemplo? La idea es que cada condición que no se cumpla mande una alerta/mensaje/excepción diferente
Buena. Agradecido y Suscrito.
Gran dato.
O sea... Al final no es que el programa "irá más rápido" simplemente será mas fácil de entender... 🤔
Así es
Se podría utilizar el && y ya, o no?
Gracias bro, muy útil el consejo
I don't know what is this trend to say that else is bad but there is this everywhere on social media
Es una buena tecnica, pero hace que el programa pruebe todos los "if" sino se cumple el primero, segundo, etc, aunque en computacion sacrificamos una cosa por otra, pero no hay optimizacion perfecta.
Cómo quiera tendría que ejecutarlo.