Questa è una didascalia per la risposta di Lie Ryan.
Come quasi tutto nella programmazione, anche qui l'approccio non sarà simile per casi diversi.
Stai giustificando la procedura di modifica con test unitari ben scritti, ma anche in questo caso, modificare direttamente una classe o renderla aperta per estensione dipende solitamente da cosa stai programmando esattamente.
Caso I.
Quando ha senso modificare una classe esistente
Immagina di avere il tuo dominio contenente la logica aziendale della tua applicazione. In un mondo ideale, le regole aziendali sono ben definite e definite. C'è solo un set di regole aziendali.
In una situazione come questa, raramente avrai implementazioni diverse di una cosa simile, sei limitato dai vincoli di business e questi devono essere ben definiti.
Probabilmente avrai dei test unitari per questo livello e quando modifichi questo livello, vuoi che i test falliscano, inidicando qualcosa (di solito una regola aziendale) è davvero cambiato.
Caso 2.
Quando ha senso estendere una classe
Poi c'è l'altra situazione, che può essere applicata praticamente a tutto il tuo dominio. Servizi, moduli, livello di persistenza, livello di caching, repository, ...
Molte di queste sono classi, che, anche se possono esistere solo una volta nel tuo codice, potrebbero essere sostituite un giorno con un'alternativa migliore. È qui che è utile codificare un'astrazione, che si tratti di un'interfaccia o di una classe astratta che agisce come un supertipo per le implementazioni concrete.
Non dipendendo da un'implementazione concreta ma un'astrazione, quando arriva una nuova alternativa per il servizio (che si tratti di memorizzazione nella cache, persistenza o elaborazione dei dati), puoi semplicemente fornire una nuova implementazione, modificare la configurazione per utilizzare la nuova implementazione e sei praticamente impostato, senza utilizzare il resto del codice (di solito piuttosto grande).
L'OCP sicuramente non ha senso per tutto. Come per ogni modello, anche questo è pensato per facilitare lo sviluppo, ma non è una regola da rispettare obbligatoriamente.