
| SOLID |
|---|
| Principles |
オブジェクト指向プログラミングにおけるオープン・クローズ原則(OCP)は、「ソフトウェアエンティティ(クラス、モジュール、関数など)は拡張に対してオープンであるべきであるが、変更に対してはクローズであるべきである」と述べています。[1]つまり、そのようなエンティティは、ソースコードを 変更することなく動作を拡張できるということです。
オープン・クローズ原則という名称は、これまで2つの意味で使われてきました。どちらの方法も、一般化(例えば、継承や委譲関数)を用いて一見矛盾する問題を解決しますが、目標、手法、そして結果は異なります。
オープン クローズ原則は、オブジェクト指向設計の 5 つのSOLID原則の 1 つです。
マイヤーのオープン・クローズ原則
ベルトラン・マイヤーは、 1988年の著書『オブジェクト指向ソフトウェア構築』[1]に登場する「オープン・クローズ原則」[2]という用語を考案したと一般的に考えられています
- モジュールがオープンであると言われるのは、拡張が可能な場合です。例えば、モジュールに含まれるデータ構造にフィールドを追加したり、モジュールが実行する関数セットに新しい要素を追加したりすることが可能である必要があります。
- モジュールが他のモジュールから利用可能な場合、そのモジュールは閉じられているとみなされます。これは、モジュールに明確に定義された安定した記述(情報隠蔽という意味でのインターフェース)が与えられていることを前提としています。
マイヤーが執筆していた当時、ライブラリにフィールドや関数を追加すると、必然的にそのライブラリに依存するプログラムに変更を加える必要があった。[要出典]この問題に対するマイヤーの提案した解決策は、オブジェクト指向継承(特に実装継承) の概念に依存していた。 [1] : 229
クラスは閉じたクラスです。コンパイルされ、ライブラリに格納され、ベースライン化され、クライアントクラスによって使用される可能性があるためです。しかし、新しいクラスがそれを親として利用し、新しい機能を追加できるため、クラスは開かれたクラスでもあります。子孫クラスを定義する際に、元のクラスを変更したり、そのクライアントに迷惑をかけたりする必要はありません。
多態的なオープン・クローズ原則
1990年代には、オープン・クローズ原則は、実装を変更したり、複数の実装を作成して互いに 多態的に置き換えたりできる抽象化されたインターフェースの使用を指すように広く再定義されました
マイヤーの用法とは対照的に、この定義は抽象基底クラスからの継承を推奨しています。インターフェース仕様は継承を通じて再利用できます。しかし、実装は必ずしも再利用する必要はありません。既存のインターフェースは変更不可であり、新しい実装は少なくともそのインターフェースを実装する必要があります。
ロバート・C・マーティンの1996年の論文「オープン・クローズ原則」[2]は、このアプローチを採用した先駆的な論文の一つです。2001年、クレイグ・ラーマンは、オープン・クローズ原則をアリスター・コックバーンの「保護されたバリエーション」と呼ばれるパターン、そしてデイヴィッド・パルナスの情報隠蔽に関する議論と関連付けました[3]。
参照
参考文献
- ^ abc Meyer, Bertrand (1988).オブジェクト指向ソフトウェア構築. Prentice Hall. ISBN 0-13-629049-3。
- ^ ab Robert C. Martin「オープン・クローズ原則」、C++レポート、1996年1月。2006年8月22日アーカイブ、Wayback Machineにて
- ^ ラーマン、クレイグ (2001年5~6月). 「保護されたバリエーション:クローズドであることの重要性」(PDF) . IEEEソフトウェア. 18 (2). IEEE: 89– 91. doi :10.1109/52.922731.
外部リンク
- OODの原則
- オープン/クローズ原則:ソフトウェア設計の変更に関する懸念
- オープン・クローズ原則とその背後に隠されたもの