La respuesta de Doc Brown es más cercana a precisa, las otras respuestas ilustran malentendidos del Principio Abierto Cerrado.
Para articular de forma explícita el malentendido, parece que hay una creencia de que el OCP significa que no se debe hacer cambios hacia atrás incompatibles (o incluso cualquier cambios o algo en este sentido.) El OCP se trata de diseñar componentes de manera que usted no necesita a realizar cambios en ellos para ampliar su funcionalidad, independientemente de si esos cambios son compatibles con versiones anteriores o no. Hay muchas otras razones además de agregar funcionalidad para que pueda realizar cambios en un componente, ya sea que sean compatibles con versiones anteriores (por ejemplo, refactorización u optimización) o incompatibles con versiones anteriores (por ejemplo, depreciar y eliminar la funcionalidad). Que pueda hacer estos cambios no significa que su componente haya violado el OCP (y definitivamente no significa que usted están violando el OCP).
Realmente, no se trata del código fuente en absoluto. Una declaración más abstracta y relevante del OCP es: "un componente debe permitir la extensión sin necesidad de violar sus límites de abstracción". Yo iría más lejos y diría que una interpretación más moderna es: "un componente debería imponer sus límites de abstracción pero permitir la extensión". Incluso en el artículo sobre el OCP de Bob Martin mientras "describe" "cerrado a modificación" como "el código fuente es inviolable", más tarde comienza a hablar sobre la encapsulación que no tiene nada que ver con modificar el código fuente y todo que ver con la abstracción fronteras
Entonces, la premisa defectuosa en la pregunta es que el OCP es (destinado como) una guía sobre la evolución de una base de código. El OCP generalmente se eslogan como "un componente debe estar abierto a extensiones y cerrado a modificaciones por parte de los consumidores". Básicamente, si un consumidor de un componente desea agregar funcionalidad al componente, debería poder extender el componente antiguo a uno nuevo con la funcionalidad adicional, pero no debería poder cambiar el componente anterior.
El OCP no dice nada sobre el creador de un componente que cambia o elimina la funcionalidad. El OCP no recomienda mantener la compatibilidad de errores para siempre. Usted, como creador, no está violando el OCP al cambiar o incluso eliminar un componente. Usted, o más bien los componentes que ha escrito, están violando el OCP si la única forma en que los consumidores pueden agregar funcionalidad a sus componentes es mediante la mutación, por ejemplo, mediante parches de monoo tener acceso al código fuente y volver a compilar. En muchos casos, ninguna de estas opciones son para el consumidor, lo que significa que si su componente no está "abierto a la extensión" no tiene suerte. Simplemente no pueden usar su componente para sus necesidades. El OCP argumenta que no debe poner a los consumidores de su biblioteca en esta posición, al menos con respecto a alguna clase identificable de "extensiones". Incluso cuando se pueden hacer modificaciones al código fuente o incluso a la copia primaria del código fuente, es mejor "pretender" que no puede modificarlo, ya que existen muchas posibles consecuencias negativas.
Entonces, para responder a sus preguntas: No, estas no son violaciones del OCP. Ningún cambio que realice un autor puede ser una violación del OCP porque el OCP no es una proporción de los cambios. Sin embargo, los cambios pueden crear violaciones del OCP y pueden estar motivados por fallas del OCP en versiones anteriores de la base de código. El OCP es una propiedad de un código particular, no la historia evolutiva de una base de código.
Por el contrario, la compatibilidad con versiones anteriores es una propiedad de un cambio de código. No tiene sentido decir que algún código es o no compatible con versiones anteriores. Solo tiene sentido hablar sobre la compatibilidad con versiones anteriores de algunos códigos con respecto a algunos códigos más antiguos. Por lo tanto, nunca tiene sentido hablar de que el primer corte de algún código sea compatible o no con versiones anteriores. El primer corte de código puede satisfacer o no satisfacer el OCP, y en general podemos determinar si algún código satisface el OCP sin hacer referencia a ninguna versión histórica del código.
En cuanto a su última pregunta, podría decirse que está fuera de tema para StackExchange en general, ya que se basa principalmente en la opinión, pero en resumen es bienvenido a la tecnología y particularmente a JavaScript, donde en los últimos años el fenómeno que describe se ha llamado fatiga de JavaScript . (Siéntase libre de google para encontrar una variedad de otros artículos, algunos satíricos, que hablan de esto desde múltiples perspectivas).