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.
"Fallo funzionare, poi fallo funzionare meglio" .
Non ricordo dove ho letto quella citazione, ma questa è la chiave per applicare bene il refactoring, e lo considero non professionale per fare diversamente.
Il refactoring continuo è come pulire le perdite mentre cucini e pulire i tuoi piatti dopo aver mangiato. Il refactoring mirato è come trovare una cucina sporca, ma avere solo il tempo di lavare un bicchiere o due sporchi. Preferiresti vivere con una cucina costantemente sporca o preferiresti mantenere le cose pulite mentre vai avanti?
Fai in modo che il codice funzioni, quindi rifletti il tuo codice per assicurarti di avere la migliore implementazione che puoi eventualmente usare. Se stai facendo qualcosa di familiare, è possibile che tu abbia implementato il codice migliore per la prima volta, tuttavia è necessario attendere qualche istante per ricontrollare il tuo lavoro per essere sicuri. Se sembra che tu possa migliorare il tuo codice, allora provi a refactoring per assicurarti che il tuo codice sia almeno snello e pulito come puoi farlo. Ciò significa che stai riducendo la quantità di debito tecnico che ti lasci alle spalle e rendi più semplice la lettura e il refactoring la prossima volta che il codice deve essere gestito. Questo è il valore fondamentale alla base del mantra TDD "Red-Green-Refactor", tranne per il fatto che in TDD si esegue il refactoring principalmente per rimuovere la duplicazione, vale la pena di rivedere anche altri elementi che potrebbero essere sottoposti a refactoring, come classi di grandi dimensioni, metodi lunghi,
Se ti trovi ad affrontare una riprogettazione importante, forse puoi rimandare per un po ', in particolare se stai scadendo molto nei tempi previsti. Ciò viene tuttavia fornito a condizione che la funzionalità del codice non venga compromessa e che l'implementazione continui a soddisfare i requisiti. Questo tipo di situazione dovrebbe essere un evento raro e puoi aiutare ad assicurarti che sia ancora più raro se stai continuamente refactoring mentre procedi. Ancora più importante, tuttavia, è che non puoi rischiare di lasciare i tuoi cambiamenti importanti per troppo tempo, altrimenti finirai per creare un carico di lavoro ancora più grande in seguito che potrebbe essere molto più costoso da riparare o potrebbe finire con un risultato ancora più costoso fallimento del progetto.
Ho l'impressione che molte persone tendano a confondere le definizioni di refactoring e reingegnerizzazione . I due termini descrivono strategie per gestire situazioni molto diverse. Se desideri riprogettare, ti impegni a fare un cambiamento drastico che cambierà il comportamento di un sistema. Ciò invaliderà alcuni test e richiederà anche nuovi test. Quando Refactor, stai assicurando che il tuo sistema continui a comportarsi esattamentelo stesso che ha fatto prima della modifica, tuttavia stai anche assicurando che il tuo codice avrà longevità e che sarà più facile da mantenere nel tempo. Non stai "sfruttando" il tuo codice per l'inferno, stai impegnando in uno standard professionale di codice pulito che ridurrà il rischio di fallimento e assicurerà che il tuo codice rimanga un piacere lavorare con, e di uno standard professionale .
Tornando all'analogia delle finestre rotte, se rompi la finestra dovresti ripararla immediatamente. Se non hai notato che una finestra è rotta, devi decidere il costo se lasci la finestra rotta. Ora, ripeti le due frasi precedenti, ma sostituisci Bug per window. Alla fine hai bisogno di una strategia diversa. Se hai creato un bug durante la codifica, lo risolvi immediatamente o vedi se le modifiche richiederanno uno sforzo di reingegnerizzazione e prendi una decisione commerciale su quando sarà meglio risolvere il problema. Quindi non si esegue il refactoring per risolvere un problema, si esegue il refactoring per assicurarsi che sia più facile trovare e risolvere i problemi. Non mi interessa quanto pensi sia fantastico il tuo codice, i sistemi complessi avranno sempre problemi che dovranno essere affrontati nel tempo. Questo è ciò che riguarda il debito tecnico e perché il refactoring deve essere un processo in corso quando si implementa il codice e non deve essere lasciato per un tempo arbitrario futuro.
Quindi, in breve, la risposta che in rari momenti può essere accettabile rinviare importanti modifiche al codice al fine di fissare una scadenza, tuttavia non dovrebbe essere considerata una pratica normale trattare il refactoring come un esercizio indipendente dal lavoro quotidiano di implementazione, e certamente mai usato come una scusa da parte di team che non hanno familiarità con la base di codice come opzione per evitare che la loro implementazione sia snella e pulita come possono eventualmente farcela in queste circostanze.