Mi trovo in una situazione leggermente simile (il codice è probabilmente di qualità molto migliore, ma abbiamo appena abbandonato il supporto per .Net 1.0)
Quello che facciamo bene per noi è il refactoring mentre andiamo a spendere qualsiasi refactoring per il tempo libero. Quindi ... Dì, hai una funzione che mette il titolo sulla pagina o qualcosa del genere. Ora, il tuo capo ha bisogno che tu modifichi la funzione del titolo in modo che il nome del sito web sia incluso in esso, non solo nella pagina specifica. Quindi, vai a sistemarlo e scopri che ci sono 5 diverse funzioni Title che fanno cose simili. Dovresti refactoring quelli a 1 funzione in modo da non dover risolvere il problema in 5 posti. Potresti anche scoprire che potrebbe essere necessario creare una classe PageTitle o qualcosa di
Sono sicuro che alcune persone non saranno d'accordo con me, ma a volte, il codice di lavoro è abbastanza buono. Se hai un enorme metodo di 1000 linee che non hai dovuto cambiare in 5 anni e non causa grossi problemi di integrazione, perché cambiarlo? Molto probabilmente non verrà toccato per i prossimi 5 anni dopo averlo refactato. Hai davvero bisogno di avere priorità quando refactoring su un programma. Questo è l'ordine generale che seguo
- Codice che sto modificando (di solito con scope per una o due classi)
- Codice che non devo necessariamente modificare, ma che causa problemi di integrazione nel codice che devo scrivere.
- Codice difficile da leggere
- Codice non facile da leggere, ma mai interrotto.
- (cioè, mai di solito) codice che potrebbe essere più pulito, ma altrimenti è decentemente leggibile e modificabile.
Esempio di vita reale di queste priorità. C'è un parser nel prodotto che sostengo che viene generato da un file di grammatica usando alcuni strumenti. È il codice più orribile che abbia mai visto, ma non è stato toccato in 5 anni o più. Non mi aspetto di doverlo toccare neanche perché non è mai stato rotto. (e abbiamo prove per essere sicuri di quello).
Tuttavia, abbiamo un punto dolente molto grande nella nostra conversione da .Net 1.0 a moderna. Un genio ha deciso di utilizzare IEnumerator
anziché IEnumerable
su tutto il codice base. Questo impedisce che i cicli foreach funzionino. Quasi ogni pezzo di codice che scrivo finisco per imbattersi nel bisogno di usare uno di questi IEnumerator. Invece di continuare a usare questo anti-pattern, lo aggiusto. Sempre. A volte, richiede la modifica di 50 o più righe di codice, ma è qualcosa che abbassa il debito tecnico dove è importante.
E lascerò un ultimo punto. UTILIZZARE IL CONTROLLO VERSIONE. Fidati di me! Se sei l'unico manutentore e il management non se ne preoccupa, quindi usa git o mercurial. Non hai nemmeno bisogno di un repository centrale per questi e ottieni comunque la maggior parte dei benefici. Il controllo della versione ha un valore inestimabile quando decidi di intraprendere un'attività di refactoring e scoprire che rompe in modo significativo le cose. Con il controllo della versione, si ripristina l'ultimo commit. Senza, incrocia le dita hai fatto una copia della directory di recente.