A livello meta, spesso scopro che quando coltivo una base di codice organicamente, parti del sistema che alla fine trovo devono conoscersi l'un l'altro (almeno attraverso qualche interfaccia) sono state disgiunte senza pietà. Ciò si verifica spesso nel codice del prototipo di ricerca, in cui si tende a pensare spesso a ritocchi e piccoli miglioramenti che non erano previsti nella base di codice originale.
Di solito, alcune impostazioni o parti di dati devono essere scandite attraverso circa 15 milioni di livelli di chiamate di funzione in modi che non ho mai previsto quando ho progettato il codice. Questo porta a un terribile dilemma:
-
Usa un brutto trucco. Questa può essere un'altra variabile globale, avviando i dati su una classe a cui chiaramente non appartiene, mettendo una serie di istruzioni di stampa nel mezzo di codice che in precedenza non aveva nulla a che fare con la logica I / O, facendo un apparentemente semplice compito in maniera molto rotonda per farlo rientrare nella mia base di codice originale, ecc.
-
refactoring della chirurgia shotgun. Questo quasi mai viene fatto in pratica, perché il codice dovrà probabilmente essere riscritto in ogni caso se è di diventare qualità di produzione, è stato difficile lavorare per la prima volta, è difficile da testare, o ho semplicemente priorità più alte rispetto a scrivere pulito, codice mantenibile quando o ho una scadenza o so che per ora è solo un prototipo. Inoltre, il prossimo tweak potrebbe rompere qualsiasi bella astrazione che mi viene in mente.
Esistono buoni meta-suggerimenti o principi di progettazione che mi aiuteranno a evitare situazioni come questa in primo luogo? Sono NON in cerca di risposte che raccomandino semplicemente il refactoring dopo il fatto, poiché una sessione di refactoring della chirurgia da incubo è esattamente il tipo di cosa che sto cercando di evitare.