Doc Brownの答えは最も正確であり、他の答えはOpen Closed Principleの誤解を示しています。
明示的に誤解を明確にするために、OCPはあなたが後方互換性のない変更を加えるべきではないことを意味することに信念があるように思われる(偶数または任意の変更またはこれらの線に沿って何かを。)あなたはしないように、OCPは、設計部品についてです必要にそれらの変更が後方互換性があるかどうかに関係なく、機能を拡張するためにそれらを変更します。機能の追加以外にも、下位互換性(リファクタリングや最適化など)または下位互換性(機能の廃止や削除など)に関係なく、コンポーネントに変更を加える多くの理由があります。これらの変更を行うことができるということは、コンポーネントがOCPに違反したことを意味するわけではありません。 OCPに違反しています)。
本当に、それはソースコードに関するものではありません。OCPのより抽象的な関連する声明は、「コンポーネントは、その抽象化の境界に違反することなく拡張を許可する必要がある」です。さらに進んで、より現代的な表現は「コンポーネントはその抽象化境界を強制するが、拡張を許可する必要がある」と言います。Bob MartinによるOCPに関する記事でも、「ソースコードは違反している」と「修正に近づいている」と説明していますが、後でソースコードの修正とは関係なく、抽象化に関係するカプセル化について話し始めます。境界。
したがって、質問の誤った前提は、OCPが(意図されている)コードベースの進化に関するガイドラインであるということです。OCPは通常、「コンポーネントは拡張機能に対して開かれ、消費者による変更に対して閉じられる必要がある」とスローガン化されています。基本的に、コンポーネントのコンシューマーがコンポーネントに機能を追加する場合、古いコンポーネントを追加機能を備えた新しいコンポーネントに拡張できますが、古いコンポーネントを変更することはできません。
OCPは、コンポーネントの作成者が機能を変更または削除することについては何も述べていません。OCPは、バグの互換性を永遠に維持することを主張していません。作成者であるあなたは、コンポーネントを変更したり削除したりすることでOCPに違反していません。消費者がコンポーネントに機能を追加できる唯一の方法が、たとえばモンキーパッチを適用することによって、OCPに違反している場合、あなたまたはあなたが書いたコンポーネントはOCPに違反していますまたは、ソースコードにアクセスして再コンパイルします。多くの場合、これらのどちらもコンシューマー向けのオプションではありません。つまり、コンポーネントが「拡張のために開かれていない」場合、それらは不運です。彼らは単にあなたのコンポーネントを彼らのニーズに使うことができません。OCPは、少なくとも特定の「拡張機能」のクラスに関しては、ライブラリの消費者をこの立場にしないと主張しています。ソースコードやソースコードのプライマリコピーに変更を加えることができる場合でも、多くのマイナスの結果が生じる可能性があるため、変更できないことを「ふり」することをお勧めします。
あなたの質問に答えるために:いいえ、これらはOCPの違反ではありません。OCPは変更の割合ではないため、作成者が行う変更はOCPの違反にはなりません。変更は、しかし、でき作成 OCPの違反を、それらがコードベースの以前のバージョンでOCPの障害によって動機付けすることができます。OCPは特定のコードのプロパティであり、コードベースの進化の歴史ではありません。
対照的に、後方互換性はコードの変更の特性です。コードの一部に下位互換性があるかどうかは、意味がありません。いくつかのコードといくつかの古いコードとの後方互換性について話をするのは理にかなっています。したがって、一部のコードの最初のカットが後方互換性があるかどうかについて話すことは意味がありません。コードの最初のカットはOCPを満たすか、または満たさない場合があり、一般に、コードの履歴バージョンを参照せずに、一部のコードがOCPを満たすかどうかを判断できます。
最後の質問については、StackExchangeは一般に主に意見に基づいているため、ほぼ間違いのないトピックですが、ここ数年で記述している現象がJavaScript疲労と呼ばれている技術、特にJavaScriptを歓迎します。(グーグルに気軽に他のさまざまな記事を見つけてください。風刺的な記事もあります。これについては複数の観点から話しています。)