hazlo de forma segura o automática, pero no ambas « Otaku – Blog de Cedric

Recientemente estuve hablando de la refactorización de lenguajes escritos dinámicamente y me sorprendió la cantidad de conceptos erróneos que muchos desarrolladores todavía tienen sobre este tema. Expuse mi punto en este artículo hace quince años (!), no ha cambiado mucho, pero la idea de que es imposible refactorizar de forma segura y automática un lenguaje que no tiene anotaciones de tipo todavía es algo que no se entiende ampliamente y se acepta, así que pensé Revisaría mi punto y modernizaría un poco el código. En primer lugar, mi afirmación: en lenguajes que no tienen anotaciones de tipo (por ejemplo, Python, Ruby, Javascript, Smalltalk), es imposible realizar refactorizaciones automáticas que sean seguras. , es decir, que garantizan no romper el código. Estas refactorizaciones requieren la supervisión del desarrollador para garantizar que el nuevo código siga funcionando. En primer lugar, decidí adaptar el fragmento de código que usé en mi artículo anterior y escribirlo en Python. Aquí hay un pequeño ejemplo que me vino a la mente: clase A: def f(self): print(«Af») clase B: def f(self): print(«Bf») if __name__ == ‘__main__’: if random( ) > 0.5: x = A() else: x = B() xf() Bastante simple: este código llamará a la función f() en una instancia de clase A o B. ¿Qué sucede cuando le pides a tu IDE que cambie el nombre de f? () a f2()? Bueno, esto es indecidible. Podrías pensar que es obvio que necesitas cambiar el nombre de Af() y Bf(), pero eso es sólo porque este fragmento es trivial. En una base de código que contiene cientos de miles de líneas, es simplemente imposible para cualquier IDE decidir qué funciones cambiar de nombre con la garantía de no romper el código. Esta vez, decidí ir un paso más allá y demostrar este punto, por lo que mucha gente todavía se niega a aceptarlo. Entonces inicié PyCharm, escribí este código, coloqué el cursor en la línea xf() y le pedí al IDE que cambiara el nombre de f() a f2(). Y esto es lo que pasó: clase A: def f2(self): print(«Af») clase B: def f(self): print(«Bf») if __name__ == ‘__main__’: if random() > 0.5 : x = A() else x = B() x.f2()PyCharm cambió el nombre del primer f() pero no del segundo. No estoy del todo seguro de cuál es la lógica aquí, pero bueno, el punto es que este código ahora no funciona y solo lo descubrirás en tiempo de ejecución. Esta observación tiene consecuencias desastrosas para la idoneidad de los lenguajes tipados dinámicamente para grandes bases de código. Dado que ya no es posible refactorizar de forma segura dichas bases de código, los desarrolladores serán mucho más reacios a realizar estas refactorizaciones porque nunca pueden estar seguros de cuán exhaustivas son las pruebas y, en caso de duda, decidirán no realizar la refactorización y dejar que el código podrido. Actualización: Discusión en Reddit. Esta entrada se publicó el 20 de junio de 2021 a las 8:17 p. m. y está guardada en Sin categoría. Puede seguir cualquier respuesta a esta entrada a través de RSS 2.0. Ambos comentarios y pings están actualmente cerrados.

About Francisco

Check Also

¿Cuánto cuesta crear una aplicación como Costco?

Con el tamaño del mercado en rápido crecimiento de la industria del comercio electrónico, intentar …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *