Odpowiedź doktora Browna jest najbliższa dokładności, inne odpowiedzi ilustrują nieporozumienia dotyczące otwartej zasady zamkniętej.
Wyraźnie artykułować nieporozumienie, nie wydaje się być przekonanie, że OCP oznacza, że nie należy wprowadzać zmian niezgodnych wstecz (lub nawet jakieś zmiany lub coś wzdłuż tych linii.) OCP jest o projektowaniu komponentów, dzięki czemu nie trzeba się wprowadzaj w nich zmiany, aby rozszerzyć ich funkcjonalność, niezależnie od tego, czy zmiany te są kompatybilne wstecz, czy nie. Istnieje wiele innych powodów oprócz dodawania funkcji, które możesz wprowadzać zmiany w komponencie, czy są one wstecznie kompatybilne (np. Refaktoryzacja lub optymalizacja) lub wstecznie niezgodne (np. Przestarzałe i usuwane funkcje). To, że możesz wprowadzić te zmiany, nie oznacza, że twój komponent naruszył OCP (i zdecydowanie nie oznacza, że ty naruszają OCP).
Naprawdę, w ogóle nie chodzi o kod źródłowy. Bardziej abstrakcyjne i stosowne stwierdzenie OCP jest następujące: „element powinien umożliwiać rozszerzenie bez potrzeby naruszania jego granic abstrakcji”. Chciałbym pójść dalej i powiedzieć, że bardziej nowoczesna wersja brzmi: „składnik powinien egzekwować swoje granice abstrakcji, ale zezwalać na rozszerzenie”. Nawet w artykule OCP autorstwa Boba Martina, który „opisuje” „zamknięty na modyfikację” jako „kod źródłowy jest nienaruszalny”, później zaczyna mówić o enkapsulacji, która nie ma nic wspólnego z modyfikacją kodu źródłowego i wszystko, co dotyczy abstrakcji Granic.
Tak więc błędnym założeniem w tym pytaniu jest to, że OCP jest (w zamierzeniu) wytyczną dotyczącą ewolucji bazy kodu. OCP jest zwykle sloganizowane jako „element powinien być otwarty na rozszerzenia i zamknięty dla modyfikacji przez konsumentów”. Zasadniczo, jeśli konsument komponentu chce dodać funkcjonalność do komponentu, powinien mieć możliwość rozszerzenia starego komponentu na nowy z dodatkową funkcjonalnością, ale nie powinien mieć możliwości zmiany starego komponentu.
OCP nie mówi nic o twórcy komponentu zmieniającego lub usuwającego funkcjonalność. OCP nie zaleca utrzymywania zgodności błędów na zawsze. Jako twórca nie naruszasz OCP poprzez zmianę lub nawet usunięcie komponentu. Ty, a raczej komponenty, które napisałeś, naruszają OCP, jeśli jedynym sposobem, w jaki konsumenci mogą dodać funkcjonalność do twoich komponentów, jest ich mutacja, np. Łatanie małplub mając dostęp do kodu źródłowego i ponownej kompilacji. W wielu przypadkach żadna z tych opcji nie jest dostępna dla konsumenta, co oznacza, że jeśli Twój komponent nie jest „otwarty na rozszerzenie”, nie ma szczęścia. Po prostu nie mogą użyć twojego komponentu do swoich potrzeb. OCP twierdzi, że nie stawia konsumentów twojej biblioteki w tej pozycji, przynajmniej w odniesieniu do jakiejś możliwej do zidentyfikowania klasy „rozszerzeń”. Nawet jeśli można dokonać modyfikacji kodu źródłowego lub nawet pierwotnej kopii kodu źródłowego, najlepiej „udawać”, że nie można go zmodyfikować, ponieważ może to mieć wiele potencjalnych negatywnych konsekwencji.
Więc, aby odpowiedzieć na twoje pytania: Nie, to nie są naruszenia OCP. Żadna zmiana dokonana przez autora nie może stanowić naruszenia OCP, ponieważ OCP nie jest właściwością zmian. Zmiany mogą jednak powodować naruszenia OCP i mogą być motywowane awariami OCP we wcześniejszych wersjach bazy kodu. OCP jest własnością określonego fragmentu kodu, a nie historii ewolucji bazy kodu.
Dla kontrastu, zgodność wsteczna jest właściwością zmiany kodu. Nie ma sensu mówić, że jakiś fragment kodu jest lub nie jest kompatybilny wstecz. Sensowne jest tylko mówienie o kompatybilności wstecznej jakiegoś kodu w stosunku do starszego kodu. Dlatego nigdy nie ma sensu mówić o tym, że pierwsze cięcie jakiegoś kodu jest kompatybilne wstecz, czy nie. Pierwsze cięcie kodu może spełniać lub nie spełniać OCP, i ogólnie możemy ustalić, czy jakiś kod spełnia OCP bez odwoływania się do jakichkolwiek historycznych wersji kodu.
Jeśli chodzi o twoje ostatnie pytanie, jest to prawdopodobnie nietypowe dla StackExchange, ponieważ jest oparte głównie na opiniach, ale w skrócie jest mile widziane w technologii, a szczególnie w JavaScript, gdzie w ciągu ostatnich kilku lat opisywane zjawisko nazywało się zmęczeniem JavaScript . (Zapraszam do google znaleźć wiele innych artykułów, niektóre satyryczne, rozmowy na ten temat z różnych perspektyw.)