Этот вопрос не о том, что такое OCP. И я также не ищу упрощенных ответов.
Итак, вот почему я спрашиваю об этом. OCP была впервые описана в конце 80-х годов. Он отражает мышление и контекст того времени. Выяснилось, что изменение исходного кода для добавления или изменения функциональности после того, как код уже был протестирован и запущен в производство, окажется слишком рискованным и дорогостоящим. Поэтому идея заключалась в том, чтобы как можно больше не изменять существующие исходные файлы и добавлять только к базе кода в виде подклассов (расширений).
Возможно, я ошибаюсь, но у меня сложилось впечатление, что сетевые системы контроля версий (VCS) не были широко распространены в то время. Дело в том, что VCS необходим для управления изменениями исходного кода.
Идея рефакторинга гораздо более поздняя. В то время изощренные IDE, которые позволяли автоматизировать операции рефакторинга, были явно несущественны. Даже сегодня многие разработчики не используют лучшие инструменты рефакторинга. Дело в том, что такие современные инструменты позволяют разработчику сменить буквально тысячи строк кода безопасно за несколько секунд.
Наконец, сегодня идея автоматизированного тестирования разработчиков (тесты на единицу/интеграцию) широко распространена. Существует множество бесплатных и сложных инструментов, которые его поддерживают. Но что хорошего создает и поддерживает большой автоматизированный набор тестов, если мы никогда/редко меняем существующий код? Новый код, как требует OCP, потребует только новых тестов.
Итак, действительно ли OCP имеет смысл сегодня? Я так не думаю. Вместо этого я бы предпочел изменить существующий код при добавлении новых функций, если новая функциональность не требует новых классов. Это позволит сохранить кодовую базу проще, меньше и намного легче читать и понимать. Риск нарушения предыдущих функциональных возможностей будет осуществляться с помощью инструментов VCS, рефакторинга и автоматизированных наборов тестов.