Quando si lavora in linguaggi privi di funzionalità integrate di struttura e organizzazione (ad es. Se non ha spazi dei nomi, pacchetti, assiemi ecc ...) o dove questi sono insufficienti per tenere sotto controllo una base di codice di quelle dimensioni, la risposta naturale è sviluppare le nostre strategie per organizzare il codice.
Questa strategia organizzativa probabilmente include standard relativi a dove conservare diversi file, cose che devono accadere prima / dopo determinati tipi di operazioni, convenzioni di denominazione e altri standard di codifica, oltre a molti "ecco come è impostato - non scherzare! " scrivi commenti - che sono validi fintanto che spiegano perché!
Poiché molto probabilmente la strategia finirà per essere adattata alle esigenze specifiche del progetto (persone, tecnologie, ambiente, ecc.), È difficile fornire una soluzione unica per la gestione di basi di codice di grandi dimensioni.
Pertanto credo che il miglior consiglio sia quello di abbracciare la strategia specifica del progetto e di farne una priorità chiave: documentare la struttura, perché è così, i processi per apportare modifiche, verificarlo per assicurarsi che venga rispettato, e soprattutto: cambiarlo quando deve cambiare.
Conosciamo principalmente classi e metodi di refactoring, ma con una base di codice di grandi dimensioni in un linguaggio del genere è la stessa strategia organizzativa (completa di documentazione) che deve essere riformattata come e quando necessario.
Il ragionamento è lo stesso del refactoring: svilupperai un blocco mentale verso il lavoro su piccole parti del sistema se ritieni che l'organizzazione complessiva di esso sia un disastro e alla fine gli consentirai di deteriorarsi (almeno questo è il mio punto di vista esso).
Le avvertenze sono uguali: utilizzare il test di regressione, assicurarsi di poter facilmente ripristinare se il refactoring non funziona correttamente e progettare in modo da facilitare il refactoring in primo luogo (o semplicemente non lo farai!).
Concordo sul fatto che sia molto più complicato del refactoring del codice diretto, ed è più difficile convalidare / nascondere il tempo da manager / clienti che potrebbero non capire perché debba essere fatto, ma questi sono anche i tipi di progetto più inclini al marciume del software causato da inflessibili design di alto livello ...