Come menziona @Sean, il refactoring dovrebbe essere separato dalle aggiunte alle funzionalità per mantenere le cose veramente pulite.
Penso che sia utile rivedere il refactoring in quanto è quello di rivedere le aggiunte delle funzionalità.
Ogni dato refactoring deve essere spiegabile, se è sufficientemente semplice, quindi in termini di piccoli passaggi di refactoring, ma soprattutto se piccoli o grandi, in termini di astrazione applicabile al dominio che viene fornita.
Una buona astrazione opera in termini di concetti e comportamenti appropriati per il consumatore che lavorano insieme per supportare gli scenari di utilizzo del consumatore.
In un'astrazione che non prevede più nuovi scenari di utilizzo, a volte l'incompletezza è costituita dall'aggiunta di codice al consumatore che spesso conosce troppo i dettagli di implementazione dell'astrazione e deve raggiungere un livello inferiore per compongono l'incompletezza. Questo crea debito tecnico diffondendo le responsabilità tra un fornitore e il suo consumatore.
Questa situazione indica il refactoring per creare un'astrazione migliorata. Un simile refactoring può aumentare un insieme esistente di concetti e comportamenti, o può sostituire le astrazioni esistenti con una nuova serie di concetti e comportamenti più appropriati e più appropriati per il dominio.
Quando facciamo il refactoring, dovrebbe essere spiegabile: la nuova astrazione incorpora un'altra capacità o un altro concetto con capacità, o forse è un insieme completamente nuovo di concetti più semplici o più utili & comportamenti.
In entrambi i casi, dovrebbe rendere le cose più facili per il consumatore, quindi il livello successivo può "stare sulle spalle" dell'astrazione refactored invece di aggirarla.
In alcuni casi, tuttavia, l'onere di implementazione per una determinata astrazione è troppo alto (non può essere fornito senza gravi compromessi) e in quei casi l'astrazione dovrebbe fornire qualcosa di più basso, semplificando l'implementazione e presentandola al consumatore in un modo diverso.
Il refactoring riguarda la negoziazione dei confini delle nostre astrazioni e, questi aggiustamenti nei limiti dovrebbero essere spiegabili a quelli che revisionano il codice.