Il refactoring è - e dovrebbe essere - un processo in corso. Non è sufficiente soddisfare semplicemente i requisiti con un'implementazione funzionante e testata che è ancora un po 'incompleta.
"Make it work, then make it work better".
Non riesco a ricordare dove ho letto quella citazione, ma questa è la chiave per applicare bene il refactoring, e considero poco professionale fare altrimenti.
Il refactoring continuo è come pulire le fuoriuscite durante la cottura e pulire i piatti dopo aver mangiato il pasto. Il refactoring mirato è come trovare una cucina sporca, ma solo avere il tempo di lavare un bicchiere sporco o due. Preferiresti vivere con una cucina continuamente sporca, o preferiresti mantenere le cose pulite mentre vai avanti?
Ottieni il codice per funzionare, quindi ti rifatti il codice per assicurarti di avere la migliore implementazione che tu possa usare. Se stai facendo qualcosa di familiare, potrebbe essere che tu implementi il codice migliore per la prima volta, tuttavia ci vorrà un momento per ricontrollare il tuo lavoro per essere sicuro. Se sembra che tu possa migliorare il tuo codice, prova a fare il refactoring per assicurarti che il tuo codice sia per lo meno snello e pulito come puoi farlo. Ciò significa che stai riducendo la quantità di debito tecnico che hai lasciato e rendi più facile la lettura e il refactoring la prossima volta che il codice deve essere trattato. Questo è il valore fondamentale alla base del mantra TDD "Red-Green-Refactor", tranne per il fatto che in TDD si refactoring principalmente per rimuovere la duplicazione, si paga anche per rivedere altri elementi che potrebbero essere refactored, come grandi classi, metodi lunghi e altri "odori di codice" che spesso possono contribuire al debito tecnico.
Se ti trovi di fronte a una riprogettazione importante, allora forse puoi rimandare per un po ', specialmente se stai andando molto in basso nel tuo programma. Ciò tuttavia è previsto non compromettendo la funzionalità del codice e purché l'implementazione continui a soddisfare i requisiti. Questo tipo di situazione dovrebbe essere un evento raro e puoi contribuire a garantire che sia ancora più raro se continui a refactoring mentre vai avanti. Ancora più importante, tuttavia, è che non si può rischiare di lasciare le modifiche importanti per troppo tempo, altrimenti si finirà per creare un carico di lavoro ancora più grande in seguito, che potrebbe essere molto più costoso da risolvere, o potrebbe finire per risultare ancora più costoso fallimento del progetto.
Ho l'impressione che molte persone tendano a confondere le definizioni di Refactoring e Re-engineering . I due termini descrivono le strategie per gestire situazioni molto diverse. Se desideri riprogettare, ti stai impegnando a fare un cambiamento drastico che altererà il comportamento di un sistema. Ciò annullerà alcuni test e richiederà anche nuovi test. Quando sei Refactor, stai assicurando che il tuo sistema continui a comportarsi esattamente come prima della modifica, tuttavia stai anche assicurando che il tuo codice abbia una longevità e che sia più facile mantenere nel tempo. Non stai "sfruttando" il tuo codice per l'inferno, ti stai impegnando per uno standard professionale di codice pulito che ridurrà il rischio di insuccesso e garantirai che il tuo codice rimarrà un piacere con cui lavorare e di uno standard professionale .
Tornando all'analogia delle finestre rotte, se rompi la finestra dovresti ripararla subito. Se non hai notato che una finestra è rotta, devi decidere il costo per te se lasci la finestra rotta. Ora, ripeti le due frasi precedenti, ma sostituisci Bug per window . Finisci per aver bisogno di una strategia diversa. Se hai creato un bug durante la codifica, lo risolvi subito o vedi se le modifiche richiedono uno sforzo di reingegnerizzazione e prendi una decisione commerciale su quando è meglio risolvere il problema. Quindi non ti rifattori per risolvere un problema, ti rifatti per assicurarti che sia più facile trovare e risolvere i problemi. Non mi importa di quanto pensi sia sorprendente il tuo codice, i sistemi complessi avranno sempre problemi che dovranno essere affrontati nel tempo. Questo è il problema del debito tecnico e perché il refactoring deve essere un processo continuo mentre implementa il tuo codice e non essere lasciato per un tempo arbitrario futuro.
In breve, la risposta è che in rare occasioni può essere accettabile rinviare importanti modifiche al codice al fine di rispettare una scadenza, tuttavia non dovrebbe essere considerata una pratica normale per trattare il refactoring come un esercizio indipendente dal tuo lavoro quotidiano di implementazione , e certamente non è mai stato usato come scusa da gruppi non familiari con la base di codice come opzione per evitare di garantire che la loro implementazione sia snella e pulita come è possibile farlo nelle circostanze.