Recentemente sto leggendo un sito web sullo sviluppo del codice pulito (non inserisco qui un link perché non è in inglese).
Uno dei principi pubblicizzati da questo sito è il Open Closed Principle : ogni componente software dovrebbe essere aperto per l'estensione e chiuso per la modifica. Ad esempio, quando abbiamo implementato e testato una classe, dovremmo solo modificarla per correggere i bug o aggiungere nuove funzionalità (ad es. Nuovi metodi che non influenzano quelli esistenti). La funzionalità e l'implementazione esistenti non dovrebbero essere cambiate.
Normalmente applico questo principio definendo un'interfaccia I e una corrispondente classe di implementazione A . Quando la classe A è diventata stabile (implementata e testata), di solito non la modifica troppo (forse, per niente), cioè
- Se arrivano nuovi requisiti (es. prestazioni, o un'implementazione completamente nuova dell'interfaccia) che richiedono grandi cambiamenti al codice, scrivo una nuova implementazione
B, e continuo a usareAfinchéBè non maturo. QuandoBè maturo, tutto ciò che è necessario è cambiare il modo in cuiIè istanziata. - Se i nuovi requisiti suggeriscono anche una modifica all'interfaccia, definisco una nuova interfaccia
I'e una nuova implementazioneA'. QuindiI,Asono congelati e rimangono l'implementazione per il sistema di produzione a condizione cheI'eA'non siano abbastanza stabili da sostituirli.
Quindi, in considerazione di queste osservazioni, mi ha un po 'sorpreso che la pagina web suggerisse l'uso di refactoring complessi , "... perché non è possibile scrivere codice direttamente nel suo modulo finale. "
Non c'è una contraddizione / conflitto tra l'applicazione del Principio Aperto / Chiuso e suggerire l'uso di refactoring complessi come best practice? Oppure l'idea è che si possono usare refactoring complessi durante lo sviluppo di una classe A , ma quando tale classe è stata testata con successo dovrebbe essere congelata?