OCP można lepiej zrozumieć, myśląc o klasach lub komponentach dostarczonych przez dostawcę A w jakiejś bibliotece czarnej skrzynki, do użytku przez użytkowników B, C i D (zauważ, że to tylko model mentalny, którego używam dla jasności, nie ma znaczenia, czy w rzeczywistości jedynym użytkownikiem klasy jest sam A).
Jeśli B, C i D mogą używać lub ponownie wykorzystywać dostarczone klasy dla różnych przypadków użycia, bez potrzeby modyfikacji kodu źródłowego biblioteki, wówczas komponent spełnia OCP ( w odniesieniu do kategorii przypadków użycia ). Istnieją różne sposoby osiągnięcia tego celu
sprawiając, że klasa będzie dziedziczona (zazwyczaj w połączeniu z wzorcem metody szablonu lub wzorcem strategii)
poprzez zapewnienie „punktów wstrzykiwania” dla wstrzykiwania zależności
przez podanie parametrów konfiguracyjnych dla klasy lub komponentu (na przykład poprzez zastosowanie parametru konstruktora „procent podatku”, jak w twoim przypadku, lub poprzez użycie innego mechanizmu konfiguracji)
może inne środki, w zależności od języka programowania lub ekosystemu
Typowe przykłady, które można znaleźć w podręcznikach, są często pierwszego lub drugiego typu (wydaje mi się, że w oczach autorów tych książek trzeci typ jest zbyt trywialny, aby o nim wspomnieć).
Jak widać, nie ma to nic wspólnego z zabronieniem jakiejkolwiek zmiany kodu źródłowego przez dostawcę A (na przykład w celu naprawy błędów, optymalizacji lub dodawania nowych funkcji w sposób zgodny z poprzednimi wersjami), co jest dość niezwiązane z OCP. OCP polega na tym, jak A projektuje interfejs i ziarnistość komponentów w lib, więc różne scenariusze ponownego użycia (takie jak ponowne użycie z różnymi stawkami podatkowymi) nie wywołują automatycznie wymagań dotyczących zmian.
Tak więc pomimo tego, co powiedziano wam tutaj innym, odpowiedź brzmi wyraźnie „tak” , byłoby to pogwałceniem OCP.
EDYCJA: wydaje się, że ktoś napisał szczegółowy post na blogu na ten temat. Chociaż niektóre jego fragmenty mogłyby być lepiej sformułowane (jak zauważył Derek Elkins), wydaje się, że autor ogólnie podziela mój punkt widzenia, że „spełnienie OCP” nie jest absolutną właściwością, ale czymś, co można ocenić tylko w kontekście pewnych kategorie zmian wymagań.