La risposta di Doc Brown è la più accurata e accurata, le altre risposte illustrano incomprensioni del principio chiuso aperto.
Per articolare in modo esplicito l'equivoco, sembra che ci sia la convinzione che l'OCP significa che non si deve fare i cambiamenti all'indietro incompatibili (o anche eventuali modifiche o qualcosa in questo senso.) L'OCP è sulla progettazione di componenti in modo che non ha bisogno di apportare modifiche per estenderne la funzionalità, indipendentemente dal fatto che tali modifiche siano o meno compatibili con le versioni precedenti. Esistono molte altre ragioni oltre all'aggiunta di funzionalità che è possibile apportare modifiche a un componente, indipendentemente dal fatto che siano compatibili all'indietro (ad esempio refactoring o ottimizzazione) o incompatibili all'indietro (ad esempio, deprecando e rimuovendo la funzionalità). Il fatto che tu possa apportare queste modifiche non significa che il tuo componente abbia violato l'OCP (e sicuramente non significa che tu stanno violando l'OCP).
Davvero, non si tratta affatto del codice sorgente. Una dichiarazione più astratta e pertinente dell'OCP è: "un componente dovrebbe consentire l'estensione senza la necessità di violare i suoi confini di astrazione". Vorrei andare oltre e dire che una versione più moderna è: "un componente dovrebbe imporre i suoi confini 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 a che fare con l'astrazione confini.
Quindi, la premessa errata nella domanda è che l'OCP è (inteso come) una linea guida sulle evoluzioni di una base di codice. L'OCP è tipicamente slogan come "un componente dovrebbe essere aperto alle estensioni e chiuso alle modifiche da parte dei consumatori". Fondamentalmente, se un consumatore di un componente desidera aggiungere funzionalità al componente, dovrebbe essere in grado di estendere il vecchio componente in uno nuovo con la funzionalità aggiuntiva, ma non dovrebbe essere in grado di cambiare il vecchio componente.
L'OCP non dice nulla sul creatore di un componente che modifica o rimuove la funzionalità. L'OCP non sta sostenendo per sempre la compatibilità dei bug . Come creatore, tu 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 è mutarlo, ad esempio con il patching delle scimmieo avere accesso al codice sorgente e ricompilare. In molti casi, nessuna di queste sono opzioni per il consumatore, il che significa che se il componente non è "aperto per l'estensione" sono sfortunati. Semplicemente non possono usare il componente per le loro esigenze. L'OCP sostiene di non mettere i consumatori della tua biblioteca in questa posizione, almeno per quanto riguarda una classe identificabile di "estensioni". Anche quando è possibile apportare modifiche 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ò costituire una violazione dell'OCP perché l'OCP non è una dimostrazione di modifiche. Le modifiche, tuttavia, possono creare violazioni dell'OCP e possono essere motivate da guasti dell'OCP nelle versioni precedenti della base di codice. L'OCP è una proprietà di un particolare pezzo di codice, non della storia evolutiva di una base di codice.
Al contrario, la compatibilità con le versioni precedenti è una proprietà di una modifica del codice. Non ha senso dire che un pezzo di codice è o non è retrocompatibile. Ha senso solo parlare della retrocompatibilità di alcuni codici rispetto ad alcuni vecchi codici. Pertanto, non ha mai senso parlare del fatto che il primo taglio di un codice sia retrocompatibile o meno. Il primo taglio di codice può soddisfare o non soddisfare l'OCP, e in generale possiamo determinare se un certo codice soddisfa l'OCP senza fare riferimento a nessuna versione storica del codice.
Per quanto riguarda la tua ultima domanda, è discutibilmente fuori tema per StackExchange in generale perché è principalmente basato sull'opinione pubblica, ma in breve è il benvenuto nella tecnologia e in particolare JavaScript, dove negli ultimi anni il fenomeno che descrivi è stato chiamato stanchezza JavaScript . (Sentiti libero di cercare su Google una varietà di altri articoli, alcuni satirici, parlando di questo da più punti di vista.)