Ok, no estoy tratando de iniciar una guerra de llama aquí, y sé que la discusión entre los lenguajes estáticos y dinámicos se ha solucionado muchas veces, incluso aquí. Pero tengo una pregunta muy práctica que espero que alguien aquí pueda arrojar algo de luz. Perdón por la longitud, pero esta no es una pregunta simple, probablemente no sea una respuesta simple.Refactorización con lenguaje de tipado dinámico
Ruby, PHP y Javascript son lenguajes bastante populares en estos días, y tienen mucha gente que los defiende y argumentan que ser tipeado dinámicamente no detiene al desarrollador. Soy nuevo en estos idiomas y me gustaría empezar a usarlos para proyectos más grandes, pero aquí hay un escenario de refactorización básico que aparece todo el tiempo en el trabajo (trabajo == C#), y me pregunto cuál sería el enfoque en Ruby: elegí a Ruby porque es OO.
Ok, estoy usando Ruby y creo un objeto Cliente. Tiene métodos para cargar/guardar/eliminar de la base de datos. Es bueno y la gente lo usa. Agrego más métodos para otras cosas y la gente lo usa más. Agrego un método para calcular el historial de pedidos basado en algunos parámetros. Por ahora, esta clase se está utilizando en todo el sistema. Entonces, un día decido cambiar los parámetros en el método GetOrderHistory. Así que:
- añadir los nuevos parámetros al método
- reescribir el código del método a utilizar los nuevos parámetros
- cambio el código de cliente que tenía en mente para pasar los nuevos parámetros y utilizar esta modificados método
¿Pero ahora qué? Tengo docenas/cientos/quién sabe cuántos otros lugares en el sistema necesitan ser cambiados. En un lenguaje OO dinámico como Ruby o Javascript, ¿cómo podría hacerlo?
De la parte superior de mi cabeza, sin saber muy bien Rubí, puedo pensar en dos respuestas tontas:
- 100% de cobertura de código. Pruebo toda la aplicación y cada vez que se rompe, veo si es ese el método y lo soluciono
- Buscar y reemplazar. Uso la búsqueda de texto para buscar ese método. Pero podría tener otros objetos con los mismos nombres de método.
¿Hay una buena respuesta para esto? Parece que el IDE lo pasaría mal. Si tuviera un código como
c = Customer.new
sería capaz de entenderlo, pero lo que si es
c= SomeFunctionThatProbablyReturnsACustomerButMightReturnOtherThings()
Entonces, ¿qué enfoque sería expertos que Rubí tomar en este caso?
Estoy bastante seguro de que la refacturación no debe romper los contratos existentes ... – CurtainDog
@CurtainDog ¿qué ocurre con el cambio de nombre de una función privada dentro de una biblioteca? – Toskan
otro buen ejemplo es ruby y python. ¿Puedo recordarte que ni Ruby ni Python se apegan a lo que acabas de decir cuando lanzas nuevas versiones? – Toskan