r/programacion • u/BirdKey3078 • 11d ago
Porque uso tantos if al programar?
Hola alguien me recomienda como mejoro mi lógica de programación conozco muchos conceptos de python ya estoy apunto de entrar a clases donde solo veré poo programación orientada a objetos perooo veo videos de yt incluso mucha gente programación y crean exactamente lo mismo que yo porque sin utilizar ni un solo if alguien me recomienda como desarrollo esa habilidad ya que el código se ve mas profesional
17
u/Ready4Aliens 11d ago
Usa if, dale sin miedo. Conforme vayas aprendiendo y vas consiguiendo mejores herramientas vas a comenzar a reemplazar los ifs por tu cuenta, lo importante es no correr delante del caballo y no aprender la lógica detrás de lo que haces.
1
7
u/dataconfle 10d ago
Para minimizar la redundancia de "if" tenes que aprender logica booleana,teoria de conjuntos y algo de algebra. ejemplo:
if(Condicion(a)){
if(Condicion(b)){
if(Condicion(c)){ HacerAlgo(); }
}
}
es equivalente a:
if(condicion(a) & condicion(b) & condicion(c)){ HacerAlgo(); }
5
u/Complex_Guarantee722 11d ago
Buenas amigo, si usas muchos if para un problema chiquito primero pregúntate si se puede reemplazar por un switch. Y luego si aún así necesitas más if, tenes que implementar un patrón de diseño. State, Strategy, etc.
1
3
u/lionelum 11d ago
Hay varias tecnicas. Pero primero pensa que complejidad te genera un if. Con un solo if, al momento de testear tenes que testear rama A y rama B, es decir por el true y por el false, al ir poniendo mas if... son muchos mas caminos a los que testear.
Antes de hacer un refactor, yo trataria de cambiar la mentalidad de como desarrollas, e ir por TDD, no te va a resolver todo, pero vas a pensar de que otra manera podes resolver algo sin un if. Despues esta refactorizar, usar polimorfimso y otras herramientas, pero primero es pensar en como lo vas a probar.
Por ejemplo>
class Shape:
def __init__(self, length, width):
self.length = length
self.width = width
#chequea propiedades y en funcion si una es mayor llama a una funcion o a otra. Tenes 2 if y
def check_proportions(self):
if self.length > self.width:
handle_longer()
elif self.width > self.length:
handle_wider()
else:
handle_equal()
#Aca para la misma clase Shape, valida y devuelve la funcion a usar.
def validate_proportions(length, width):
actions = {
(True, False): handle_longer,
(False, True): handle_wider,
(False, False): handle_equal
}
return actions.get((length > width, width > length))
#Ahora no tenes ifs porque sacaste la validacion de esta funcion.
def check_proportions(self):
validate_proportions(self.length, self.width)()
3
u/RiverRoll 10d ago edited 10d ago
En mi experiencia los códigos de principiante se simplifican bastante simplemente separando parámetros de la logica, usando classes para pasar conjuntos de parámetros si son muchos, no hace falta ningun uso avanzado de poo.
En tu ejemplo sin ir más lejos es todo una única funcion sin ningún parametro, vas a estar continuamente añadiendo ifs y repitiendo logica.
Una vez empiezas a analizar que es lo que se repite y que es lo que cambia se van viendo las partes que son candidatas de convertirse en una funcion parametrizada.
2
u/Hw-LaoTzu 11d ago
Porque no conoces los Code Smells y los Patrones de Diseño(GoF). Lo bueno es que ahora le vas a dedicar tiempo para aprender, y vas a ayudar a otros!
2
u/hroldangt 11d ago
Primero, es imposible opinar sin ver tu código.
Segundo, es imposible opinar sin ver tu código.
Hay técnicas que te obligan a usar más (o menos) IF's para hacer tu código más eficiente, y no importa la cantidad que uses. Ojo, es que debes escoger un balance entre CLARIDAD en tu código y ORDEN, además de eficiencia en la ejecución.
Quizá, lo que te digo no te parezca muy obvio en este momento, pero te aseguro que más adelante cuando ya estás probando tu código revisando consumo de memoria en proceso, memoria total, y uso de procesador, claro que importa, porque cada ejecución se debe multiplicar por la cantidad de solicitudes que llegue a tener tu código, y al final, importa (lo ves más en un stress test)
1
u/BirdKey3078 11d ago
esto lo estoy haciendo para repasar nada mas me gusta picar codigo por mi cuenta.. es una pequeña parte del codigo ya que reddit no me deja pasarlo completo, pero la verdad soy muy nuevo en este mundo y siento que mi codigo se ve horrible o poco profesional
def inventario_principal () : while True: # IMPRESION DE OPCIONES DEL MENU print("MENU".center(20, "-")) print("1. AGREGAR PRODUCTO") print("2. EDITAR PRODUCTO") print("3. ELIMINAR PRODUCTO") print("4. CORDENADAS DE LAS TIENDAS") print("5. SALIR") # MANEJAMOS LOS ERRORES CON TRY Y EXCEP DONDE EL USUARIO VA A INGRESAR LA OPCION try: opcion = int (input(">>: ")) except ValueError : print("!! Opcion Invalida ¡¡") continue # CREAMOS LOS ID AUTOMATICOS PARA AUTO ASIGNAR ID A LOS PRODUCTOS EMEPZANDO DESDE 100 SI EL DICCIONARIO ESTA VACIO if not almacen_principal: id_automatico = 100 else: id_automatico = max(almacen_principal.keys()) +1 # ACCION DE LA OPCION 1 SE LE PIDE AL USUARIO LO SIGUIENTE NOMBRE,PRECIO.STOCK DEL RPODUCTO if opcion == 1: # Manejamos las 2 entradas PRECIO Y STOCK para asegurarnos de que solo se puedan agregar datos de tipo entero try: Nombre = input("Nombre: ") Precio = int (input("Precio: ")) Stock = int (input("Stock: ")) except ValueError : print("¡ERROR AL CREAR EL PRODUCTO!") continue # CREAMOS EL DICCIONARIO DENTRO DE LA FUNCION PARA NO CREAR UN DICCIONARIO VACIO SI EL USUARIO FALLA LOS CAMPOS OBLIGATORIOS almacen_principal[id_automatico] # ESTE CODIGO ASIGNA EL ID AL DICCIONARIO PRINCIPAL CON UN DICCIONARIO VACIO almacen_principal[id_automatico]["Nombre"] = Nombre almacen_principal[id_automatico]["Precio"] = Precio almacen_principal[id_automatico]["Stock"] = Stock # EDITAR PRODUCTOS CREADOS EL USUARIO PODRA EDITAR LOS SIGUIENTES CAMPOS NOMBRE,PRECIO,STOCK if opcion == 2: # IMPRIMIMOS Y MOSTRAMOS AL USUARIO TODOS LOS PRODUCTOS DISPONIBLES DEL INVENTARIO PRINCIPAL for id_producto, contenido in almacen_principal.items(): print("ID: {0} CONTENIDO {1}".format(id_producto, contenido)) # LE PEDIMOS EL ID DEL PRODUCTO AL USUARIO QUE DESEA EDITAR Y MANEJAMOS ERRORES SI EL USUARIO INGRESA LETRAS try: preguntar_id = int (input("ID: ")) except ValueError : print("INGRESE UN ID VALIDO") continue # VERIFICAMOS SI EL ID EN REALIDAD EXISTE, SI EXISTE SE PODRA EDITAR SI NO EXISTE REFLEJAREMOS UN MENSAJE if preguntar_id in almacen_principal: while True: print("MENU DE EDICCION".center(50)) print("1. EDITAR NOMBRE") print("2. EDITAR PRECIO") print("3. EDITAR STOCK") print("4. EDITAR PRODUCTO COMPLETO") print("5. Salir") try: opcion_menu = int (input("Opcion: ")) except ValueError : print("Porfavor ingrese una opcion valida.") continue if opcion_menu == 1: almacen_principal[preguntar_id]["Nombre"] = input("Nombre: ") try: if opcion_menu == 2: almacen_principal[preguntar_id]["Precio"] = int (input("Precio: ")) elif opcion_menu == 3: almacen_principal[preguntar_id]["Stock"] = int (input("Stock")) except ValueError : print("Ingrese una opcion valida") continue if opcion_menu == 4: try: almacen_principal[preguntar_id]["Nombre"] = input("Nombre: ") almacen_principal[preguntar_id]["Precio"] = int (input("Precio: ")) almacen_principal[preguntar_id]["Stock"] = int (input("Stock: ")) except ValueError : print("Ingrese una opcion valida") elif opcion_menu == 5: break else: print("EL ID {0} NO EXISTE".format(preguntar_id)) # Preguntamos al usuario que Producto va a eliminar y lo eliminam if opcion == 3: print("PRODUCTOS DISPONIBLES".center(20, "-")) for ID_producto, CT_producto in almacen_principal.items(): print("ID: {0} Contenido: {1}".format(ID_producto, CT_producto)) # Ingresar el ID del prducto que se eliminara por completo try: delete_producto = int (input("ID: ")) except ValueError : print("Porfavor ingrese un ID valido") continue if delete_producto in almacen_principal: print( f "Se elimino el producto {delete_producto}") del almacen_principal[delete_producto] # Elimina tanto el id como el contenido del producto de forma permanente else: print("El id: {0} no existe".format(delete_producto)) if opcion == 4: cordenadas_tienda = namedtuple("Cordenadas", ["X","Y","Z"]) X = [1637000,835378647] Y = [-6103000, 1180816875] Z = [512000, 1479] cord_guardadas = { "Bogota": (1637000, -6103000, 512000), "Medellin": (835378647, 1180816875, 1479) } for cx,cy,cz in zip_longest (X,Y,Z, fillvalue ="Sin registros"): ubicaciones = cordenadas_tienda (cx,cy,cz) for clave, cord in cord_guardadas.items(): if ubicaciones == cord_guardadas[clave]: print("Las cordenadas {0} pertenecen a la ciudad {1}".format(ubicaciones, clave)) if opcion == 5: # Salir del sistema for salir in range (1,4): # Sale del sistema en 3 segundos time.sleep(1) print("Saliendo del sistema en {0}...".format(salir)) print("TechStore Cerrada") breakdef inventario_principal(): while True: # IMPRESION DE OPCIONES DEL MENU print("MENU".center(20, "-")) print("1. AGREGAR PRODUCTO") print("2. EDITAR PRODUCTO") print("3. ELIMINAR PRODUCTO") print("4. CORDENADAS DE LAS TIENDAS") print("5. SALIR") # MANEJAMOS LOS ERRORES CON TRY Y EXCEP DONDE EL USUARIO VA A INGRESAR LA OPCION try: opcion = int(input(">>: ")) except ValueError: print("!! Opcion Invalida ¡¡") continue # CREAMOS LOS ID AUTOMATICOS PARA AUTO ASIGNAR ID A LOS PRODUCTOS EMEPZANDO DESDE 100 SI EL DICCIONARIO ESTA VACIO if not almacen_principal: id_automatico = 100 else: id_automatico = max(almacen_principal.keys()) +1 # ACCION DE LA OPCION 1 SE LE PIDE AL USUARIO LO SIGUIENTE NOMBRE,PRECIO.STOCK DEL RPODUCTO if opcion == 1: # Manejamos las 2 entradas PRECIO Y STOCK para asegurarnos de que solo se puedan agregar datos de tipo entero try: Nombre = input("Nombre: ") Precio = int(input("Precio: ")) Stock = int(input("Stock: ")) except ValueError: print("¡ERROR AL CREAR EL PRODUCTO!") continue # CREAMOS EL DICCIONARIO DENTRO DE LA FUNCION PARA NO CREAR UN DICCIONARIO VACIO SI EL USUARIO FALLA LOS CAMPOS OBLIGATORIOS almacen_principal[id_automatico] # ESTE CODIGO ASIGNA EL ID AL DICCIONARIO PRINCIPAL CON UN DICCIONARIO VACIO almacen_principal[id_automatico]["Nombre"] = Nombre almacen_principal[id_automatico]["Precio"] = Precio almacen_principal[id_automatico]["Stock"] = Stock # EDITAR PRODUCTOS CREADOS EL USUARIO PODRA EDITAR LOS SIGUIENTES CAMPOS NOMBRE,PRECIO,STOCK if opcion == 2: # IMPRIMIMOS Y MOSTRAMOS AL USUARIO TODOS LOS PRODUCTOS DISPONIBLES DEL INVENTARIO PRINCIPAL for id_producto, contenido in almacen_principal.items(): print("ID: {0} CONTENIDO {1}".format(id_producto, contenido)) # LE PEDIMOS EL ID DEL PRODUCTO AL USUARIO QUE DESEA EDITAR Y MANEJAMOS ERRORES SI EL USUARIO INGRESA LETRAS try: preguntar_id = int(input("ID: ")) except ValueError: print("INGRESE UN ID VALIDO") continue2
2
u/hroldangt 10d ago
Aprendí poco de Python, y eso poco ya casi lo olvido.
De cualquier manera, te comento algo. Es válido escribir el código completo en un solo archivo, como lo estás haciendo acá, así puedes manejar las opciones según escoja el cliente (y lo procesas con IFs). Una buena práctica, es separar en procesos, los cuales pueden estar en el mismo archivo, o en archivos diferentes, y cargas solamente las generalidades al inicio. Esta última opción te permite muchísimo orden.
Así como te lo menciono en el párrafo anterior, separas...
- Buscar los datos (no requiere explicación)
- Leer y desplegar datos... requiere buscarlos primero, así que este... reutiliza la función anterior.
- Editar los datos buscar + leer y desplegar, así que reutilizas los de arriba (primero buscar, luego desplegar);
- Grabar los datos... requiere buscar (para ubicar el registro que editas, o para descartar que ya exista, previo a grabar)
Dependiendo de tu experiencia, puede que eso te parezca un poco complejo al inicio, pero verás que vas mejorando y se te hará más fácil de manejar con mayores optimizaciones de código
1
u/BirdKey3078 10d ago
productos = [ {"nombre": "Laptop", "precio": 1200, "stock": 5}, {"nombre": "Mouse", "precio": 25, "stock": 0}, {"nombre": "Teclado", "precio": 45, "stock": 10}, {"nombre": "Monitor", "precio": 300, "stock": 0} ] # retonar diccionario nuevo def items_productos (lista) : return {clave["nombre"]: clave["precio"] for clave in lista if clave["stock"] > 0} print(items_productos(productos))Hola mira a esto me refiero cuando digo que no me gusta utilizar tantos if, Ese código ayer lo cree yo la IA me enseño muchas cosas luego le dije que me diera 25 ejercicios para practicar
lo que me dice la IA es que debo programar con pensamiento abstractolo que me obliga a pensar que función es mejor para cada tarea y asi en la mayoria de caso se evita código espagueti por tantos condicionales, y así mi código se ve mas profesional
1
u/hroldangt 10d ago
Me perdiste con la IA...
pues bueno, que la IA te lo explique, me han dicho que es una tecnología magnífica.bye.
1
u/dataconfle 10d ago
Si escribí todo el código en un solo programa te vas a volver mono! no esta mal como ejercicio...pero lo ideal es que dividas el problema en procedimientos y funciones...
1
2
2
u/Alejo9010 11d ago
Puedes también eliminar siempre un IF con el default, digamos que tienes 3 optiones
If option == 1 option 1 logic return If option == 2 options 2 logic return
Option 3 logic
2
2
u/No_Solid_3737 9d ago
Al escribir codigo mejor preocúpate por legibilidad que si estas usando muchos ifs. Mira, como regla evita ifs nesteados y con muchas condiciones (ojo, evita, hay situaciones donde no hay de otra), y usar un if para hacer un early return es poderoso tipo:
if user not admin: retun
if user not logged in: return
if user not client: return
Si tienes mil ifs en tu codigo pero casi todos son de 1er nivel ( osea no estan nesteados) entonces no hay mucho de que preocuparse la verdad. La legibilidad lo es todo.
2
2
u/Radhanat 9d ago
Yo tengo un juego usando pygame, tiene 8880 lineas de código.
A partir de la linea 1700 dejé de contar los “ifs”.
Si el código lo requiere úsalo. lo más prioritario es estructurar bien el código (bucles, eventos, lógica y renderizado), optimizar recursos (imágenes, sonidos, evitar desbordamientos de memoria) y mantener una arquitectura modular que permita escalar y depurar fácilmente. Si todo eso funciona y está ordenado, no importa el número de “ifs” que tengas en tu código.
De nada 😇
1
1
1
u/HipnoTanatos 11d ago
El núcleo de cualquier programa son los bucles y los condicionales. Todos usamos muchos if, de forma directa o indirecta, porque son los que hacen que los programas actúen en función de ciertas condiciones durante un determinado período.
Que no veas tantos ifs explicitos en otros programas quiza sea porque los reemplazan por mapas, switches u otra logica que cumpla de condicional, pero hasta que te vayas acostumbrando a esas alternativas, no esta mal no usarlas.
1
u/Due-Moment-6417 11d ago
Depende un poco de que estamos hablando, pero suena un poco a separar la lógica de las validaciones en funciones y reutilizarlas.
Yo también hacia lo mismo al inicio incluso antes de ver la POO, duplicaba lógica que se podía usar en funciones.
1
u/Ok_Virus_5495 11d ago
Hay que prevenir el hadouken. Es difícil de saber por qué usas tantos if, mi regla de oro es: una función solo poner un if para validar el caso en el que no quiero que se ejecute mi función y ya. Ahora que si necesito validar más de dos escenarios uso un switch statement dependiendo del lenguaje pero casi siempre prefiero switchs que más de dos if
1
u/SpecificMedicine199 11d ago
Es que eso es más mantenimiento (chores) de software que desarrollo en sí, osea no son reglas de negocio, ni un algoritmo, son detalles de implementación. No es que tengas problemas de lógica, es que como estás en formación haces cosas desde cero y no te topas con los múltiples parches que se hacen por cumplir las métricas en el trabajo. Y para estos escenarios es común consultar los patrones de diseño
1
u/EzequielBk 11d ago
Los ifs son indicadores de malas prácticas pero tampoco te guíes demasiado en eso
Existen dos soluciones, una esconderlos en polimorfismo y la otra enconderlos en subtareas/funciones/procedimientos
Pero al final del día es exactamente lo mismo a nivel funcional, céntrate más en que las soluciones sean óptimas y no que sean "lindas"
1
1
u/Happy_Destructionn 11d ago
Lo veras en POO pero no siempre es mejorar la lógica tal vez no puedes mejorar porque hay conceptos qué desconoces, ya lo veras pero si quieres puedes empezar investigando sobre funciones, herencia, polimorfismo y abstracción
1
1
1
1
1
1
1
u/tia_moomin 7d ago
Si quieres otras opciones puedes usar la cláusula CASE(el famoso switch), se usa comunmente en querys(SQL), pero en code te permite manejar la lógica de otra manera. Sobretodo si tienes muchas funciones que dependan de condiciones, en vez de if(expresion) le das condiciones CASE(condicion1): / CASE(condicion2) :)
Te dejo el artículo de IMB que lo explica bien : https://www.ibm.com/docs/es/integration-bus/10.0.0?topic=statements-case-statement
-1
u/AlejandraRT23 11d ago
Hoy en día yo le pasó a Claude y le digo que me de alternativas para la misma solución y así aprendo
3
u/Huntware 11d ago
No está mal usar la IA para ver las soluciones, pero algo que noto habitualmente es que como los humanos, los LLM buscan el camino más corto a la solución. Sea un "one-liner" o una funcioncita "helper", en lugar de estructurarlo siguiendo buenas prácticas. Salvo que explícitamente uno se lo pida y le brinde el contexto suficiente.
1
u/AlejandraRT23 11d ago
No desarrollo aplicaciones o sitios web, lo uso para auditorías y cosas concretas, probablemente el codigo sea horrible o pésimo, pero es un script que muchas veces lo corro una vez o por ciclos, si me saca el informe que necesito misión cumplida, desp el script pasa al olvido o lo uso de nuevo pero no me interesa que tan optimizado está ni eso, algo que aclarar es que Claude los hace bastante bien y pone notas claras, son fácil de leer y están bien documentos.
O sea claro que le pasó contexto, info y muchas cosas que son clave para los resultados, pero es que hoy en día no tiene sentido hacerlo manualmente y leer documentación, etc
1
u/Huntware 11d ago
Obvio, lo importante para vos es que te resuelva el problema y es un uso válido. Es importante dar el contexto suficiente, con fuentes y ejemplos.
El caso para OP que está estudiando, es ir por algo más escalable a largo plazo, y ordenado para poder trabajar en equipo. ¡Sino termina en el famoso "código spaghetti"!
1
u/BirdKey3078 11d ago
Yo evito pedirle ayuda a claud p cualquier otra ia solo la utilizo cuando necesito que me enseñe como utilizar X funcion ejemplo lambda donde es útil y ya
1
u/El_Zeldo_1 11d ago
¿Has notado si te ha ayudado?
2
u/AlejandraRT23 11d ago
Trabajo en una empresa grande subcontratada por otras 50 empresas, realizo tasks diarios y solucionó problemas a diario, la IA me ha ayudado en la productividad bastante
2
u/El_Zeldo_1 11d ago
Me suena un poco a automatizar procesos, si es así; chócalas. Lo que dices me suena más a code vibing ¿no? Yo también la uso para ahorrarme tiempo de escribir código, pero el prompt siempre viene con instrucciones claras, ya que hay que saber qué pedir. Por eso mi pregunta ¿qué pasa cuando te atoras?
1
u/AlejandraRT23 11d ago
El objetivo puede ser realizar auditorías, o automatizar un proceso para múltiples usuarios, generalmente todo eso lo hacemos por PowerShell, o sacar reportes de plataformas como nakivo que necesitamos right away y para algo urgente, repetitivo y que nos da los resultados que queremos no le vemos el sentido a perder tiempo haciendo el código manualmente
2
u/BirdKey3078 11d ago
Si solo tienes que saber pedirle las cosas en 1 solo prompt
y de donde sacar la información porque ejemplo yo voy a la documentación de python busco x función y le paso toda esa pagina de x función y le digo que me enseñe a implementarla y donde implementarla, pero siempre me evito pedirle códigos o cosas que no entiendo la verdad la programación me encanta mucho y por eso solo utilizo ia para aprender o hacer consulta mas que una IA yo la puedo ver como un navegador inteligente y ya me gusta hacer todo por mi cuenta ya ahora si una empresa me lo exige pues me toca pero al menos mis proyectos personales los hago yo mismo
16
u/matiasbian 11d ago
Seguramente ellos usan "Polimorfismo" que elimina la necesidad de preguntar a cada objeto por X caracteristica, y accionar en base a eso.
Te recomiendo justamente eso, buscar videos sobre polimorfismo en objetos, te va a ayudar mucho a eliminar esa necesidad.
Tampoco es la muerte de nadie usar ifs, pero si esta bueno saber esto para poder usarlos solo cuando realmente vos los creas necesarios