MeyerのObject-Oriented Software Construction(1988)で、彼は次のようにオープン/クローズド原則を定義しています。
- モジュールがまだ拡張可能であれば、モジュールは開いていると言われます。たとえば、フィールドに含まれるデータ構造にフィールドを追加したり、実行する一連の機能に新しい要素を追加したりすることができます。
- モジュールは、他のモジュールで使用できる場合、閉じられていると言われます。これは、モジュールに明確に定義された安定した説明(情報隠蔽という意味でのインターフェース)が与えられていることを前提としています。
彼は言い続けます:
モジュールを再度開く場合、古いバージョンに依存しているため、すべてのクライアントを再度開いて更新する必要があります。…[この問題]は、モジュールを新しい関数またはデータ要素によって拡張する必要があるたびに発生し、直接および間接クライアントの変更をトリガーします。...設計とプログラミングに対する古典的なアプローチでは、オープンとクローズの両方のモジュールを記述する方法はありません。
このジレンマに対するMeyerの解決策は、既存のクラスを変更してライブラリモジュールを拡張しないことです。代わりに、既存のクラスをサブクラス化する新しいモジュールを作成し、新しいクライアントがその新しいモジュールに依存するようにします。
今、1988年に、私はTurbo PascalとBlankenship Basicでおもちゃ(手続き)プログラムを書いていました、そして、21世紀の専門的な経験はJVM、CLR、および動的言語でしたので、Meyerの意味がわかりません「設計とプログラミングへの古典的なアプローチ」による。
Meyerのクライアントモジュールを再度開く必要がある理由の具体例(より多くのケースを必要とする、より多くのメンバーを含む列挙のswitchステートメント)は十分に合理的なようですが、ライブラリに機能を追加するたびにアサーションを正当化することはほとんどありませんモジュール、すべてのクライアントを更新する必要があります。
この主張が1988年に自明であると思われる歴史的な理由はありますか?たとえば、C静的ライブラリに関数またはデータ構造を追加すると、下位互換性のあるAPIでもクライアントを再コンパイルする必要があるようにレイアウトが変更されましたか?または、MeyerはAPIの下位互換性を強制するメカニズムについて本当に話しているだけですか?