Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




Wei-Yu

Using exceptions for flow control is highly frowned upon in most languages, but not in Python. Using exceptions for flow control in Python is "pythonic."

un día menos en el año y otro día más en el que recordar que cualquier cosa que se haga en python es justo lo opuesto de lo que deberías hacer

3 respuestas
uint8_t

#61771 try .. except ... pass (y nunca petará un programa, la auténtica salud y el paradigma del bien hacer ante tus jefes/clientes).

P.D: Hello Java!

desu

#61771 xq usar excepciones esta mal? nos lo puedes explicar al resto? o es que lo has leido en algun lado y no has entendido nada y lo repites como loro?

1 2 respuestas
Wei-Yu

#61773 muy mal take, mételo otra vez en el trastero a ver si en cinco años es relevante

1 respuesta
CiudadanoEj

#61766 yo hace nada me pille acer nitro v15 e iba a tirar de windows con wsl y quiza para algo mas especifico alguna VM con kali o Parrot

1 respuesta
desu

#61774 lo que imaginaba.. no tienes ni idea de lo que hablas

spidermanman

#61773 las excepciones solo las pueden usar gente excepcional, por eso no lo entienden, déjalos

2
Traber

#61771 El approach de python es "ask forgiveness, not permission", y tiene cierto sentido en cuanto a que las comprobaciones condicionales son muy "manuales" digamos, y a veces podemos acceder a campos sin comprobar que no existen, son nulos... Lanzando y capturando excepciones, podemos abarcar TODOS los casos, aunque no los manejemos uno a uno.

Si hacemos un check (por ejemplo, isValid(variable)) y ese isValid no se actualiza pero la estructura de objeto y su uso si, se te puede colar un objeto no válido pero que haya sido marcado como válido por esa función porque no está actualizada, o porque el rango de valores es demasiado amplio. Si capturas la excepción, vas a tener un punto de control válido en todo caso:

  • Si te pasas de rango, excepción
  • Si accedes a un campo no existente, excepción
  • Si casteas a un tipo que no cuadra con el valor de origen, excepción

Cubres todos los casos en una sola operación. También puedes agrupar por tipo de excepción para cubrir casos específicos de fallo. Pero en todo caso, es más future-proof que una implementación basada en checks de "IsNullOrEmpty", "IsWhitespace", "IsNumber", etc.

Y por lo que veo, en Python el coste de lanzar una excepción no es muy grande:

Python uses a technique known as "zero-cost" exception handling, which minimizes the cost of supporting exceptions. In the common case (where no exception is raised) the cost is reduced to zero (or close to zero). The cost of raising an exception is increased, but not by much.

1 respuesta
Fyn4r

excepción

f. Cosa que se aparta de la regla o condición general de las demás de su especie.

1 respuesta
HeXaN

#61779 Python es una excepción.

3
GenBe

#61768 picar web

#61775 justo ese lo recomendaron por el hilo de portátiles, el de 32gb ram está a muy buen precio. Qué tal va de batería?

1 respuesta
desu
        def merge(left, right):
            merged = []
            i, j = 0, 0
            while i < len(left) and j < len(right):
                if left[i] <= right[j]:
                    merged.append(left[i])
                    i += 1
                else:
                    merged.append(right[j])
                    j += 1
            merged.extend(left[i:])
            merged.extend(right[j:])
            return merged

    def merge_sort(arr):
        if len(arr) < 2:
            return arr

        mid = len(arr) // 2
        left = merge_sort(arr[:mid])
        right = merge_sort(arr[mid:])
        return merge(left, right)
        def quick_sort(arr):
            if len(arr) <= 1:
                return arr
            
pivot = arr[len(arr) // 2] left = [] middle = [] right = [] for num in arr: if num < pivot: left.append(num) elif num > pivot: right.append(num) else: middle.append(num) return quick_sort(left) + middle + quick_sort(right)
CiudadanoEj

#61781 pues me acaba de llegar hoy en unos dias te digo!

desu


tu editor te hace estos inline errors?

Wei-Yu

#61778 como norma general lo que dice fyn4r es el rule of thumb canónico que se utiliza para explicar esta situación: las excepciones son para situaciones excepcionales. Esto se traduce en no usarlas para controlar el flujo del código. Un ejemplo pueden ser validaciones de dominio como comprobar que un dato es válido (como un email) o que el estado de los datos permiten realizar la operación que se pretende realizar (como un check de permisos).

Desarrollando un poco el rule of thumb y sin meternos en desvaríos de performance, recurrir frecuentemente a excepciones hace el código menos legible porque implica una indirección que no es fácil de seguir:

public User FindUser(Guid guid)
{
  if (guid == default) throw new EmptyGuidException("User GUID can't be empty");
  
  return new User(guid: guid);
}

Si necesitas saber cuándo o cómo se gestiona (o si se gestiona siquiera) EmptyGuidException tienes que navegar el callstack a mano. Navegar usando el "go to reference" del editor no te servirá porque se usará en otros cientos de sitios. Tampoco sabes fácilmente si esta excepción es atrapada por un try-catch que use una excepción padre (por ejemplo la clase excepción raíz que en csharp se llama Exception). Esto cuando son 4 funciones no pasa nada pero se hace evidente que no escala bien con la complejidad del código.

Resumen de la jugada: has perdido mucho y no has ganado nada a cambio.

Si lo abordas desde la perspectiva del consumidor de esa función...

public interface IExample
{
  User FindUser(Guid guid);  
}

Para saber qué excepciones tira tienes que leer el código de la implementación y decidir como consumidor qué te resulta relevante gestionar y qué no. Esto de base ya es un smell (code against spec not implementation). Al utilizar excepciones para definir escenarios no terminantes estás incrustando lógica del dominio en ellas, lo que hace que necesites ser consciente de qué excepciones se tiran porque están acopladas al dominio y no a un estado terminante. Algo terminante sería pasarle un yaml a un código que parsea xml. Algo del dominio es que al deserializar el XML los datos resultantes no cumplan las garantías requeridas.

El resumen continúa siendo el mismo: has perdido mucho y no has ganado nada a cambio.

No estoy inventando la rueda tampoco, con googlear "are exceptions an antipattern" te saldrá todo y podrás tirar del hilo hasta decir basta. Tampoco estoy diciendo que nunca deban usarse excepciones, sólo que no deberían usarse como control flow mechanisms.

#61778Traber:

podemos abarcar TODOS los casos, aunque no los manejemos uno a uno

Esto en concreto es un antipattern cuyo principio general es muy recurrente: limar tiempo escribiendo código a cambio de perder garantías en runtime u ofuscar la futura lectura del código. Tú que eres puntonetero si no recuerdo mal, el ejemplo canónico de mala práctica para ahorrarse tiempo escribiendo es automapper. Conviertes un compile-time issue en un runtime issue, ofuscas el código y encima a poco que necesites hacer algo complejo mueves la solución de csharp al DSL de automapper. Pierdes todo y ganas absolutamente nada.

El acto de escribir código prácticamente nunca es un bottleneck y el código está para que lo lea una persona o para que se ejecute en producción. Hacer un error explícito en vez de usar un umbrella catch siempre será mejor porque te da más información. Siempre digo lo mismo: modelar y gestionar errores es el 80% del curro de un dev.

1
spidermanman

alguien se ha visto un curso de codely y quiere sacar pechito

Wei-Yu

8
uint8_t

Y eso que picáis código para gestionar frutas y verduras.... si fuese algo en plan, controlar la reacción de un sistema nuclear.... os veo escribiendo el código en tarjetas perforadas.

Runig666

Mucho antipattern mucha polla, pero luego te llega un juego de cartas con un IF de cienmil lineas y media y nos lo gozamos todos.

desu

ask forgiveness not permission

pero si a una colección le haces un remove/delete de un elemento que no existe, borras algo que ya esta borrado, te tira excepcionar en lugar de ok...

[1,2,3] - 4 = [1,2,3]
laZAr0

Y pa k kieres hacer eso jaja saludos