Recentemente sto leggendo un sito web sullo sviluppo di codice pulito (non inserisco un link qui perché non è in inglese).
Uno dei principi pubblicizzati da questo sito è il principio chiuso aperto : ogni componente software deve essere aperto per l'estensione e chiuso per modifica. Ad esempio, quando abbiamo implementato e testato una classe, dovremmo modificarla solo per correggere bug o aggiungere nuove funzionalità (ad esempio nuovi metodi che non influenzano quelli esistenti). Le funzionalità e l'implementazione esistenti non devono essere modificate.
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 modifico troppo (forse, per niente), cioè
- Se arrivano nuovi requisiti (ad es. Prestazioni o un'implementazione totalmente nuova dell'interfaccia) che richiedono grandi modifiche al codice, scrivo una nuova implementazione
B
e continuo a utilizzarlaA
finchéB
non è matura. QuandoB
è maturo, tutto ciò che serve è cambiare la modalità diI
istanza. - Se i nuovi requisiti suggeriscono anche una modifica all'interfaccia, definisco una nuova interfaccia
I'
e una nuova implementazioneA'
. CosìI
,A
sono congelati e restano l'attuazione del sistema di produzione più a lungoI'
eA'
non sono abbastanza stabili per sostituirli.
Quindi, alla luce di queste osservazioni, sono rimasto un po 'sorpreso dal fatto che la pagina web abbia poi suggerito l'uso di refactoring complessi , "... perché non è possibile scrivere il codice direttamente nella sua forma finale".
Non esiste una contraddizione / conflitto tra l'applicazione del principio aperto / chiuso e la proposta di utilizzare refactoring complessi come best practice? O l'idea qui è che si possono usare refactoring complessi durante lo sviluppo di una classe A
, ma quando quella classe è stata testata con successo dovrebbe essere congelata?