La risposta di Doc Brown è la più vicina alla precisione, le altre risposte illustrano le incomprensioni del principio Open Closed.
Per articolare esplicitamente l'equivoco, sembra esserci la convinzione che l'OCP significhi che non si dovrebbero apportare modifiche all'indietro incompatibili (o anche qualsiasi modifica o qualcosa del genere). L'OCP riguarda progettare componenti in modo che non bisogno di apportare modifiche ad essi per estendere le loro funzionalità, indipendentemente dal fatto che tali modifiche siano compatibili o meno. Ci sono molti altri motivi oltre all'aggiunta di funzionalità che è possibile apportare modifiche a un componente, indipendentemente dal fatto che siano retrocompatibili (ad esempio, refactoring o ottimizzazione) o retrocompatibili (ad esempio, funzionalità deprecating e rimozione). Il fatto che tu possa apportare queste modifiche non significa che il tuo componente abbia violato l'OCP (e sicuramente non significa che tu stia violando l'OCP).
In realtà, non si tratta affatto di codice sorgente. Una frase più astratta e rilevante dell'OCP è: "un componente dovrebbe consentire l'estensione senza necessità di violare i suoi confini di astrazione". Vorrei andare oltre e dire che una versione più moderna è: "un componente dovrebbe imporre i suoi limiti di astrazione ma consentire l'estensione". Anche nell'articolo sull'OCP di Bob Martin mentre "descrive" "chiuso alla modifica" come "il codice sorgente è inviolato", in seguito inizia a parlare di incapsulamento che non ha nulla a che fare con la modifica del codice sorgente e tutto ciò che riguarda l'astrazione confini.
Quindi, la premessa difettosa nella domanda è che l'OCP è (inteso come) una linea guida sulle evoluzioni di un codice base. L'OCP è in genere definito come "un componente dovrebbe essere aperto alle estensioni e chiuso alle modifiche dei consumatori". Fondamentalmente, se un consumatore di un componente vuole aggiungere funzionalità al componente dovrebbe essere in grado di estendere il vecchio componente in uno nuovo con la funzionalità aggiuntiva, ma dovrebbero non essere in grado di modificare il vecchio componente.
L'OCP non dice nulla sul creatore di una componente che modifica o rimuove funzionalità. L'OCP non sta promuovendo per sempre la compatibilità dei bug . Tu, come creatore, non stai violando l'OCP cambiando o addirittura rimuovendo un componente. Tu, o meglio i componenti che hai scritto, stai violando l'OCP se l'unico modo in cui i consumatori possono aggiungere funzionalità ai tuoi componenti è la sua mutazione, ad es. da patch per scimmia o con accesso al codice sorgente e ricompilazione. In molti casi, nessuna di queste opzioni è per il consumatore, il che significa che se il componente non è "aperto per l'estensione" non ha fortuna. Semplicemente non possono usare il tuo componente per i loro bisogni. L'OCP sostiene di non mettere i consumatori della tua biblioteca in questa posizione, almeno per quanto riguarda alcune classi di "estensioni" identificabili. Anche quando le modifiche possono essere fatte al codice sorgente o anche alla copia primaria del codice sorgente, è meglio "fingere" di non poterlo modificare poiché ci sono molte potenziali conseguenze negative nel farlo .
Quindi per rispondere alle tue domande: No, queste non sono violazioni dell'OCP. Nessuna modifica apportata da un autore può essere una violazione dell'OCP, in quanto l'OCP non è una propensione ai cambiamenti. Le modifiche, tuttavia, possono creare violazioni dell'OCP e possono essere motivate da errori dell'OCP nelle versioni precedenti del codebase. L'OCP è una proprietà di un particolare pezzo di codice, non la storia evolutiva di un codebase.
Per contrasto, la compatibilità all'indietro è una proprietà di una modifica di codice. Non ha senso dire che un pezzo di codice è o non è retrocompatibile. Ha senso solo parlare della compatibilità all'indietro di qualche codice rispetto a di un codice precedente. Pertanto, non ha mai senso parlare del primo taglio di un codice che sia retrocompatibile o meno. Il primo taglio di codice può soddisfare o non riuscire a soddisfare l'OCP e, in generale, è possibile determinare se alcuni codici soddisfano l'OCP senza fare riferimento a versioni storiche del codice.
Per quanto riguarda la tua ultima domanda, è discutibilmente fuori tema per StackExchange in generale essendo fondamentalmente basato sull'opinione pubblica, ma il corto è ben accetto alla tecnologia e in particolare JavaScript dove negli ultimi anni il fenomeno che hai descritto è stato chiamato stanchezza di JavaScript . (Sentiti libero di google per trovare una varietà di altri articoli, alcuni satirici, che parlano di questo da più punti di vista.)