программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения.
открыты для расширения: это означает, что поведение модуля может быть расширено. Когда требования приложения изменяются, мы способны расширить модуль новыми линиями поведения, которые удовлетворяют возникшим изменениям.
Другими словами, у нас есть возможность расширять классы, делая их более функциональными. При этом поведение старых методов не меняется, как и самого класса в целом.
закрыты для изменения/модификации: в результате расширения поведения сущности, не должны вноситься изменения в код, который эти сущности использует.
любые изменения в исходном коде, требуют за собой пересмотр всего кода, где используется данная сущность/класс.
пересмотр модульного тестирования и других подобных процедур.
Код, подчиняющийся данному принципу, не изменяется при расширении и поэтому не требует таких трудозатрат.