この質問は、OCP とは何かに関するものではありません。また、単純な答えも求めていません。
だから、ここに私がこれを尋ねる理由があります。OCP は 80 年代後半に初めて説明されました。当時の考え方や文脈が反映されています。懸念事項は、ソース コードを変更して機能を追加または変更することは、コードが既にテストされて運用に投入された後で、リスクとコストがかかりすぎるということでした。そのため、既存のソース ファイルをできるだけ変更することを避け、サブクラス (拡張機能) の形でコードベースに追加するだけにするという考えがありました。
私が間違っているかもしれませんが、私の印象では、ネットワーク ベースのバージョン管理システム(VCS) は当時はあまり使用されていませんでした。ポイントは、VCS はソース コードの変更を管理するために不可欠であるということです。
リファクタリングのアイデアは、はるかに最近のものです。自動リファクタリング操作を可能にする洗練された IDE は、当時は確かに存在しませんでした。今日でも、多くの開発者は利用可能な最高のリファクタリング ツールを使用していません。ここでのポイントは、このような最新のツールを使用すると、開発者は文字どおり数千行のコードを安全に、数秒で変更できるということです。
最後に、今日、自動化された開発者テスト(ユニット/統合テスト) のアイデアが広まっています。それをサポートする多くの無料の洗練されたツールがあります。しかし、既存のコードをまったくまたはほとんど変更しない場合、大規模な自動テスト スイートを作成して維持することに何のメリットがあるでしょうか。OCP が要求する新しいコードは、新しいテストのみを必要とします。
では、今日の OCP は本当に理にかなっているのでしょうか? 私はそうは思わない。代わりに、新しい機能が新しいクラスを必要としない場合は、新しい機能を追加するときに既存のコードを変更することを実際に好みます。そうすることで、コードベースがよりシンプルで小さくなり、読みやすく理解しやすくなります。以前の機能が壊れるリスクは、VCS、リファクタリング ツール、および自動化されたテスト スイートによって管理されます。