Aquí hay tres cosas:
Principios
Esta es una cara de la moneda. Hasta cierto punto, creo que es bueno insistir en corregir errores (o malas implementaciones, incluso si "funcionan"), incluso si nadie se da cuenta.
Míralo de esta manera: el problema real no es necesariamente el error, en tu ejemplo, sino el hecho de que un programador pensó que era una buena idea implementar el bucle de esta manera, en primer lugar. Era obvio desde el primer momento, que esta no era una buena solución. Ahora hay dos posibilidades:
El programador simplemente no se dio cuenta. Bueno ... un programador debe desarrollar una intuición de cómo se ejecuta su código. No es que la recursión sea un concepto muy difícil. Al corregir el error (y sudar a través de todo el trabajo adicional), tal vez aprenda algo y lo recuerde, aunque solo sea para evitar el trabajo adicional en el futuro. Si la razón era que él no tenía el tiempo suficiente, la gestión podría aprender que los programadores no necesitan más tiempo para crear un código de mayor calidad.
El programador lo notó, pero lo consideró "no es un problema". Si esto se deja en pie, entonces se desarrolla una cultura de laissez-faire que, en última instancia, conducirá a errores donde realmente duele. En este caso particular, a quién le importa. Pero, ¿qué pasa si ese programador está desarrollando una aplicación bancaria la próxima vez y decide que cierta constelación nunca sucederá? Entonces lo hace. Malos tiempos.
Pragmatismo
Este es el otro lado. Por supuesto, es probable que, en este caso particular, no solucione el error. Pero cuidado: hay pragmatismo y luego hay pragmatismo. Un buen pragmatismo es si encuentra una solución rápida pero sólida pero bien fundada para un problema. Es decir, evitas diseñar cosas en exceso, pero las cosas que implementas todavía están bien pensadas. El pragmatismo malo es cuando simplemente piratea algo que funciona "exactamente" y se romperá en la primera oportunidad.
Falla rápido, falla duro
En caso de duda, falle rápido y fracase duro.
Esto significa, entre otros, que su código nota la condición de error, no el entorno.
En este ejemplo, lo menos que puede hacer es hacerlo para que no ocurra el error de tiempo de ejecución difícil ("profundidad de pila excedida" o algo así), reemplazándolo por una fuerte excepción propia. Podría, por ejemplo, tener un contador global y decidir arbitrariamente que rescatará después de 1000 videos (o cualquier número que sea lo suficientemente alto como para que nunca ocurra en el uso normal, y lo suficientemente bajo como para funcionar en la mayoría de los navegadores). Luego, dale a esa excepción (que puede ser una excepción genérica, por ejemplo, una RuntimeException
en Java o una cadena simple en JavaScript o Ruby) un mensaje significativo. No tiene que ir al extremo para crear un nuevo tipo de excepciones o lo que sea que haga en su lenguaje de programación particular.
De esta manera, tienes
- ... documentado el problema dentro del código.
- ... lo convirtió en un problema determinista. Usted sabe que su excepción ocurrirá. No le gustan los cambios en la tecnología del navegador subyacente (piense no solo en el navegador de la PC, sino también en los teléfonos inteligentes, las tabletas o la tecnología futura).
- ... lo hizo fácil de arreglar cuando eventualmente necesitas arreglarlo. La fuente del problema se señala en su mensaje, obtendrá un retroceso significativo y todo eso.
- ... todavía no perdió tiempo en el manejo de errores "reales" (recuerde, nunca espera que ocurra el error).
Mi convención es prefijar tales mensajes de error con la palabra "Paranoia:". Esta es una señal clara para mí y para todos los demás de que nunca espero que se produzca ese error. Puedo separarlos claramente de las excepciones "reales". Si veo uno así en una GUI o un archivo de registro, sé con certeza que tengo un problema grave: después de todo, nunca esperé que ocurrieran. En este punto, entro en modo crujiente (con una buena posibilidad de resolverlo rápida y fácilmente, ya que sé exactamente dónde ocurrió el problema, salvándome de muchas depuraciones espurias).