布朗博士的答案最接近准确,其他答案则说明了对开放式封闭原则的误解。
要明确阐明误解,似乎有一个信念,即OCP意味着你不应该向后兼容的更改(甚至任何沿着这些路线的改变或什么的。)的OCP是如何设计的组件,这样你就不会需要到对其进行更改以扩展其功能,无论这些更改是否向后兼容。除了添加功能之外,还有许多其他原因,您可以对组件进行更改,无论它们是向后兼容的(例如,重构或优化)还是向后不兼容的(例如,过时和删除功能)。您可以进行这些更改并不意味着您的组件违反了OCP(并且绝对不意味着您 违反了OCP)。
确实,这根本与源代码无关。OCP的一个更抽象和相关的陈述是:“组件应允许扩展而无需违反其抽象边界”。我将进一步讲,更现代的再现是:“组件应强制其抽象边界,但允许扩展”。甚至在鲍勃·马丁(Bob Martin)在OCP上发表的文章中,“将”接近修改的“描述为”源代码被违反“时,他后来也开始谈论封装,它与修改源代码无关,而与抽象有关边界。
因此,该问题的错误前提是,OCP(旨在作为)有关代码库演变的指南。OCP通常被口号为“一个组件应该对扩展开放,而对消费者不应该进行修改”。基本上,如果组件的使用者希望向该组件添加功能,则他们应该能够将旧组件扩展为具有附加功能的新组件,但他们应该不能更改旧组件。
OCP并没有说明更改或删除功能的组件的创建者。OCP并不主张永远保持错误兼容性。作为创建者,您不会通过更改甚至删除组件来违反OCP。如果消费者可以向组件添加功能的唯一方法是通过对其进行变异(例如通过猴子补丁),则您或您编写的组件违反了OCP。或有权访问源代码并重新编译。在许多情况下,这些都不是消费者的选择,这意味着,如果您的组件没有“开放供扩展”,那么它们就倒霉了。他们根本无法使用您的组件来满足他们的需求。OCP争辩说,至少在某些可识别的“扩展名”方面,不要让您的图书馆的用户处于这种位置。即使可以对源代码甚至源代码的主副本进行修改,也最好“假装”您不能对其进行修改,因为这样做有很多潜在的负面影响。
因此,请回答您的问题:不,这些都不违反OCP。作者所做的任何更改都不能违反OCP,因为OCP并非更改的一部分。的变化,但是,可以创建违反OCP,他们可以通过在代码库的以前版本的OCP失败的动机。OCP是特定代码段的属性,而不是代码库的演进历史。
相比之下,向后兼容是代码更改的属性。说某些代码向后兼容或不向后兼容是没有道理的。谈论某些代码相对于某些较旧代码的向后兼容性才有意义。因此,谈论某些代码是否具有向后兼容性是没有道理的。代码的第一部分可以满足或不满足OCP,并且通常我们可以在不参考任何历史版本的情况下确定某些代码是否满足OCP。
关于最后一个问题,对于StackExchange来说,它基本上是基于观点的,因此通常可以说是离题的,但是对于技术(尤其是JavaScript)来说,它的简短之处是受欢迎的,在过去的几年中,您描述的现象被称为JavaScript疲劳。(可以随时通过Google查找各种其他文章,有些是讽刺性的,它们从多个角度进行讨论。)