Jest to prawdopodobnie najtrudniejsza z solidnych zasad do wyjaśnienia. Pozwól mi spróbować. Wyobraź sobie, że napisałeś klasę faktury, która działa idealnie i nie zawiera błędów. Robi PDF faktury.
Następnie ktoś mówi, że chce faktury HTML z linkami. Nie zmieniasz żadnego kodu na fakturze, aby spełnić to żądanie. Zamiast tego tworzysz inną klasę, fakturę HTML, która robi to, czego teraz chce. Korzystasz z dziedziczenia, abyś nie musiał pisać dużo zduplikowanego kodu w fakturze HTML.
Stary kod, który korzystał ze starej faktury, nie jest uszkodzony ani nie jest w żaden sposób naruszony. Nowy kod może korzystać z faktury HTML. (Jeśli wykonasz także Liskov substitutability , L bryły, możesz nadać instancjom HTMLInvoice istniejący kod, który oczekuje instancji Faktury.) Wszyscy żyją długo i szczęśliwie.
Faktura jest zamknięta dla modyfikacji, otwarta na rozszerzenie. Aby to zadziałało, musisz poprawnie napisać Fakturę, btw.
Czy czytałeś artykuł The Open-Closed Principle autorstwa kumpli wujka Boba z ObjectMentor? Myślę, że to jedno z lepszych wyjaśnień.
źródło
Odpowiedź Kate Gregory jest bardzo dobra, ale pod inną sytuację, w której nowy wymóg może być spełniony przez stosunkowo niewielką zmianę w istniejącej
Invoice
klasie. Załóżmy na przykład, że do faktury PDF należy dodać nowe pole. Według OCP powinniśmy nadal tworzyć nową podklasę, nawet jeśli nowe pole można dodać do istniejącej implementacji, zmieniając kilka wierszy kodu.W moim rozumieniu OCP odzwierciedla rzeczywistość lat 80. i wczesnych 90., w których projekty często nawet nie korzystały z kontroli wersji, a tym bardziej miały zautomatyzowane testy regresji lub zalety zaawansowanych narzędzi refaktoryzacyjnych. OCP był próbą uniknięcia ryzyka złamania kodu, który został ręcznie przetestowany i wprowadzony do produkcji. Obecnie mamy lepsze sposoby zarządzania ryzykiem uszkodzenia działającego oprogramowania (a mianowicie systemów kontroli wersji, TDD i testów automatycznych oraz narzędzi do refaktoryzacji).
źródło
Osobiście uważam, że tę zasadę należy wziąć ze szczyptą soli. Kod jest organiczny, firmy zmieniają się, a kod zmienia się zgodnie z potrzebami firmy w miarę upływu czasu.
Bardzo trudno mi się skupić na tym, że abstrakcja jest kluczowa. Co jeśli abstrakcja była pierwotnie nieprawidłowa? Co się stanie, jeśli funkcja biznesowa ulegnie znaczącej zmianie?
Ta zasada zasadniczo zapewnia, że ORYGINALNE intencje i zachowanie projektu nigdy się nie zmieniają. To prawdopodobnie działa dla tych, którzy mają publiczne interfejsy API, a ich klienci mają problemy z nadążaniem za nowymi wersjami i niektórymi innymi przypadkowymi przypadkami. Jeśli jednak firma jest właścicielem CAŁEGO kodu, podważam tę zasadę.
Dobre testowanie kodu powinno sprawić, że refaktoryzacja bazy kodu będzie dziecinnie prosta. Oznacza to, że nie ma problemu z pomyłkami - twoje testy pomogą ci lepiej zaprojektować.
Mówiąc, że jeśli nie ma żadnych testów, to zasada jest zdrowa.
źródło