Ok, non sto provando a iniziare una guerra di fiamma qui, e so che l'argomento tra i linguaggi statici e dinamici è stato troncato molte volte, anche qui. Ma ho una domanda molto pratica che spero che qualcuno qui possa fare luce. Ci scusiamo per la lunghezza, ma questa non è una domanda semplice, probabilmente non è una risposta semplice.Refactoring con linguaggio digitato dinamicamente
Ruby, PHP e Javascript sono lingue molto popolari al giorno d'oggi, e hanno un sacco di persone che li difendono e sostengono che essere digitati dinamicamente non trattiene lo sviluppatore. Sono nuovo di questi linguaggi e vorrei iniziare a usarli per progetti più grandi, ma qui c'è uno scenario di refactoring di base che appare tutto il tempo al lavoro (lavoro == C#), e mi chiedo quale sarà l'approccio in Ruby: ho scelto Ruby perché è OO.
Ok, sto usando Ruby e costruisco un oggetto Cliente. Ha metodi per caricare/salvare/cancellare dal database. È buono e le persone lo usano. Aggiungo altri metodi per altre cose e le persone lo usano di più. Aggiungo un metodo per calcolare la cronologia degli ordini in base ad alcuni parametri. Ormai questa classe viene utilizzata in tutto il sistema. Quindi, un giorno decido di cambiare i parametri sul metodo GetOrderHistory. Così ho:
- aggiungo i nuovi parametri per il metodo
- riscrivere il codice del metodo di utilizzare i nuovi parametri
- cambiamento del codice client che avevo in mente di passare i nuovi parametri e utilizzare questo modificato metodo
Ma ora che cosa? Ho dozzine/centinaia/whoknows quanti altri posti nel sistema che devono essere cambiati. In un linguaggio OO dinamico come Ruby o Javascript, come potrei fare questo?
Fuori della parte superiore della mia testa, non sapendo rubino molto bene, mi vengono in mente due risposte muti:
- 100% di copertura di codice. Esamino l'intera app e ogni volta che si rompe vedo se è quel metodo e lo risolvo
- Trova e sostituisci. Io uso la ricerca di testo per cercare quel metodo. Ma potrei avere altri oggetti con gli stessi nomi di metodo.
Quindi c'è una buona risposta a questo? Sembra che l'IDE abbia delle difficoltà. Se avessi codice come
c = Customer.new
sarebbe in grado di capirlo, ma se si tratta di
c= SomeFunctionThatProbablyReturnsACustomerButMightReturnOtherThings()
Così che cosa approccio esperti si rubino prendere in questo caso?
Sono abbastanza sicuro che il refactoring non dovrebbe rompere i contratti esistenti ... – CurtainDog
@CurtainDog, che dire del rinominare una funzione privata all'interno di una libreria? – Toskan
un altro buon esempio è rubino e pitone. Posso essere gentile a ricordarti che né rubino né pitone si attengono a ciò che hai appena detto quando rilasci nuove versioni? – Toskan