La réponse de Doc Brown est la plus exacte, les autres réponses illustrent des malentendus concernant le principe de fermeture.
Pour exprimer explicitement le malentendu, il semble y avoir une croyance que l'OCP signifie que vous ne devriez pas faire des changements en arrière incompatibles (ou même des changements ou quelque chose le long de ces lignes.) L'OCP est sur la conception de composants de sorte que vous n'avez pas besoin de apportez-leur des modifications pour étendre leurs fonctionnalités, que ces modifications soient compatibles avec les versions antérieures ou non. Outre l'ajout de fonctionnalités, vous pouvez apporter des modifications à un composant, qu'il soit rétro-compatible (par exemple, refactoring ou optimisation) ou rétro-compatible (par exemple, en dépréciant et en supprimant des fonctionnalités). Le fait que vous apportiez ces modifications ne signifie pas que votre composant a violé l’OCP (et ne signifie certainement pas que vous violent l’OCP).
En réalité, il ne s'agit pas du tout de code source. Une déclaration plus abstraite et pertinente de l'OCP est la suivante: "un composant devrait permettre une extension sans qu'il soit nécessaire de violer ses limites d'abstraction". J'irais plus loin en disant qu'une interprétation plus moderne est: "un composant doit imposer ses limites d'abstraction tout en permettant une extension". Même dans l'article de Bob Martin sur l'OCP, alors qu'il décrit "le code source comme étant inviolable", il commence ensuite à parler d'encapsulation, qui n'a rien à voir avec la modification du code source et tout ce qui concerne l'abstraction. limites.
La prémisse erronée de la question est donc que l'OCP est (censé être) un guide sur les évolutions d'une base de code. L'OCP est généralement sloganisé comme "un composant doit être ouvert aux extensions et fermé aux modifications par les consommateurs". Fondamentalement, si un consommateur d'un composant souhaite ajouter des fonctionnalités au composant, il devrait pouvoir étendre l'ancien composant à un nouveau avec les fonctionnalités supplémentaires, mais ne devrait pas pouvoir modifier l'ancien composant.
L'OCP ne dit rien sur le créateur d'un composant qui modifie ou supprime des fonctionnalités. L'OCP ne préconise pas de maintenir la compatibilité des bogues pour toujours. En tant que créateur, vous ne violez pas le panneau de commande en modifiant ou même en supprimant un composant. Vous, ou plutôt les composants que vous avez écrits, violez le panneau de commande si le seul moyen pour les utilisateurs d’ajouter des fonctionnalités à vos composants est de le muter, par exemple en appliquant des correctifs monkeyou avoir accès au code source et recompiler. Dans de nombreux cas, aucune de ces options ne constitue une option pour le consommateur, ce qui signifie que si votre composant n'est pas "ouvert à l'extension", il n'a pas de chance. Ils ne peuvent tout simplement pas utiliser votre composant pour leurs besoins. L'OCP recommande de ne pas placer les consommateurs de votre bibliothèque dans cette position, du moins en ce qui concerne une catégorie identifiable d'extensions. Même lorsque des modifications peuvent être apportées au code source ou même à la copie principale du code source, il est préférable de "prétendre" que vous ne pouvez pas le modifier car cela pourrait avoir de nombreuses conséquences négatives.
Donc, pour répondre à vos questions: non, ce ne sont pas des violations de l'OCP. Aucune modification apportée par un auteur ne peut constituer une violation du PCO car ce dernier n'est pas une propriété des changements. Toutefois, les modifications peuvent créer des violations du protocole OCP et peuvent être motivées par des défaillances du protocole OCP dans les versions précédentes de la base de code. L'OCP est une propriété d'un morceau de code particulier, pas l'histoire évolutive d'une base de code.
En revanche, la compatibilité ascendante est une propriété d’un changement de code. Cela n'a aucun sens de dire qu'une partie du code est ou non compatible avec les versions antérieures. Il est logique de parler de la compatibilité ascendante de certains codes par rapport à des codes plus anciens. Par conséquent, il n’a jamais de sens de parler de la première version d’un code compatible ou non avec la version antérieure. La première copie de code peut satisfaire ou ne pas satisfaire à l'OCP, et en général, nous pouvons déterminer si un code satisfait à l'OCP sans faire référence à aucune version historique du code.
En ce qui concerne votre dernière question, on peut dire que StackExchange est généralement hors sujet en tant qu’opinion, mais les technologies, et en particulier JavaScript, sont les bienvenues. En effet, ces dernières années, le phénomène que vous décrivez a été appelé fatigue JavaScript . (N'hésitez pas à chercher sur Google plusieurs autres articles, certains satiriques, qui abordent ce sujet sous plusieurs angles.)