Die Antwort von Doc Brown ist am ehesten zutreffend, die anderen Antworten veranschaulichen Missverständnisse des Open-Closed-Prinzips.
Um ausdrücklich das Missverständnis zu artikulieren, so scheint es ein Glaube zu sein , dass das OCP bedeutet , dass Sie nicht rückwärts inkompatible Änderungen vornehmen (oder sogar alle Änderungen oder etwas in diese Richtung.) Die OCP - Komponenten über die Gestaltung so , dass Sie nicht brauchen , um Nehmen Sie Änderungen vor, um die Funktionalität zu erweitern, unabhängig davon, ob diese Änderungen abwärtskompatibel sind oder nicht. Neben der Hinzufügung von Funktionen gibt es viele andere Gründe, aus denen Sie Änderungen an einer Komponente vornehmen können, unabhängig davon, ob diese abwärtskompatibel (z. B. Refactoring oder Optimierung) oder abwärtskompatibel (z. B. Ablehnen und Entfernen von Funktionen) ist. Dass Sie diese Änderungen vornehmen, bedeutet nicht, dass Ihre Komponente gegen das OCP verstoßen hat (und bedeutet definitiv nicht, dass Sie dies tun gegen die OCP verstoßen).
Wirklich, es geht überhaupt nicht um Quellcode. Eine abstraktere und relevantere Aussage der OCP lautet: "Eine Komponente sollte eine Erweiterung ermöglichen, ohne dass dabei ihre Abstraktionsgrenzen verletzt werden müssen." Ich würde noch weiter gehen und sagen , eine modernere Interpretation ist: „eine Komponente sollte erzwingen seine Abstraktion Grenzen aber für die Erweiterung ermöglichen“. Sogar in dem Artikel über das OCP von Bob Martin, in dem er "für Modifikationen verschlossen" beschreibt, dass "der Quellcode unverletzt ist", spricht er später von Kapselung, die nichts mit Modifikationen des Quellcodes und allem mit Abstraktion zu tun hat Grenzen.
Die fehlerhafte Prämisse in der Frage ist also, dass das OCP eine Richtlinie über die Entwicklung einer Codebasis ist (beabsichtigt ist). Das OCP wird in der Regel als Slogan bezeichnet: "Eine Komponente sollte für Erweiterungen offen und für Änderungen durch Verbraucher geschlossen sein." Grundsätzlich sollten Verbraucher einer Komponente, die der Komponente Funktionen hinzufügen möchten, in der Lage sein, die alte Komponente durch die zusätzlichen Funktionen zu erweitern, die alte Komponente jedoch nicht zu ändern .
Das OCP sagt nichts über den Schöpfer einer Komponente aus , die Funktionen ändert oder entfernt . Die OCP plädiert nicht dafür, die Fehlerkompatibilität für immer aufrechtzuerhalten . Sie als Urheber verletzen das OCP nicht, indem Sie eine Komponente ändern oder sogar entfernen. Sie, oder besser gesagt die Komponenten, die Sie geschrieben haben, verletzen das OCP, wenn die Konsumenten Ihre Komponenten nur durch Mutation, z. B. durch Affen-Patching , funktionalisieren könnenoder Zugriff auf den Quellcode und erneutes Kompilieren. In vielen Fällen handelt es sich nicht um Optionen für den Verbraucher, dh wenn Ihre Komponente nicht "erweiterungsfähig" ist, hat er kein Glück. Sie können Ihre Komponente einfach nicht für ihre Bedürfnisse verwenden. Die OCP plädiert dafür, die Konsumenten Ihrer Bibliothek nicht in diese Position zu versetzen, zumindest in Bezug auf eine erkennbare Klasse von "Erweiterungen". Selbst wenn Änderungen können auf den Quellcode oder sogar die primäre Kopie des Quellcodes gemacht werden, ist es am besten zu „vorgeben“ , dass Sie es nicht ändern können , da es viele möglichen negativen Folgen sind so zu tun.
Um Ihre Fragen zu beantworten: Nein, dies sind keine Verstöße gegen die OCP. Keine Änderung, die ein Autor vornimmt, kann einen Verstoß gegen das OCP darstellen, da das OCP kein Verhältnis von Änderungen darstellt. Die Änderungen können jedoch erstellen Verletzungen des OCP, und sie können durch Ausfälle der OCP in früheren Versionen der Code - Basis motiviert werden. Das OCP ist eine Eigenschaft eines bestimmten Codeteils, nicht die Evolutionsgeschichte einer Codebasis.
Für dagegen die Abwärtskompatibilität ist eine Eigenschaft einer Änderung des Codes. Es macht keinen Sinn zu sagen, dass ein Teil des Codes abwärtskompatibel ist oder nicht. Es ist nur sinnvoll, über die Abwärtskompatibilität eines Codes mit einem älteren Code zu sprechen . Daher ist es nie sinnvoll, davon zu sprechen, dass der erste Teil eines Codes abwärtskompatibel ist oder nicht. Der erste Codeschnitt kann das OCP erfüllen oder nicht erfüllen, und im Allgemeinen können wir feststellen, ob ein Code das OCP erfüllt, ohne auf historische Versionen des Codes Bezug zu nehmen.
Was Ihre letzte Frage anbelangt, so ist StackExchange im Allgemeinen wohl eher als meinungsbasiert eingestuft, aber kurz gesagt, es ist willkommen, JavaScript zu verwenden, wobei das von Ihnen beschriebene Phänomen in den letzten Jahren als JavaScript-Müdigkeit bezeichnet wurde . (Fühlen Sie sich frei zu googeln , um eine Vielzahl anderer Artikel zu finden, von denen einige satirisch sind und darüber aus verschiedenen Perspektiven sprechen.)