開放/閉鎖原則
開放/閉鎖原則(かいほうへいさげんそく。open/closed principle、OCP)とは、オブジェクト指向プログラミングにおいて、クラス(およびその他のプログラム単位)は
- 拡張に対して開いて (open) いなければならず、
- 修正に対して閉じて (closed) いなければならない
という設計上の原則である。
つまり、あるクラスが一度コードレビューやユニットテストなどの品質検査を通過し実際の運用に入ったならば、そのクラスを修正してはならず、拡張によって対処しなければならない。
オブジェクト指向プログラミングには、「グローバル変数を使ってはならない」「インスタンス変数はすべてprivateにする」などの様々なノウハウや豊富なデザインパターンがあるが、開放/閉鎖原則がそれらの根底にあるといわれる[1]。
開放/閉鎖原則という名前で呼ばれるものは2つある。どちらも問題の解決に継承を用いているが、その目的・テクニック・結果は異なっている。
目次 |
[編集] メイヤーの開放/閉鎖原則
バートランド・メイヤーが1988年に Object Oriented Software Construction の中で「開放/閉鎖原則」という語を生み出したと一般に称される。それは、一度完成したら、クラスの実装はエラーの修正のためのみに変更でき、新機能や機能変更には別のクラスを作る必要があるというものだった。そのようなクラスはオリジナルのクラスから継承によってコードの再利用が可能となる。派生したサブクラスはオリジナルのクラスと同じインタフェースを持っていても持っていなくともよい。
メイヤーの定義では実装の継承が擁護されている。実装は継承によって再利用可能だが、インタフェース仕様は必ずしもそうではない。既存の実装は修正に対して閉じており、また新しいクラスは既存のインタフェースを引き継ぐ必要はない。
[編集] ポリモーフィックな開放/閉鎖原則
1990年代、開放/閉鎖原則とは一般的に抽象インタフェースの利用を指すように意味が変わっていった。その定義では実装はもはや固定ではなく、複数の実装が存在可能となり、互いにポリモーフィックに入れ替えることができる。
メイヤーのものと対照的に、この定義ではインタフェースの継承(または仮想継承)が擁護されている。インタフェース仕様は継承によって再利用可能だが、実装は必ずしもそうではない。既存のインタフェースは修正に対して閉じており、また新しいクラスは(少なくとも)そのインタフェースを実装しなければならない。
ロバート・C・マーチンの"The Open-Closed Principle" (1996) はこの立場をとる影響力の大きな論文のひとつである。2001年にはクレーグ・ラーマンが、"OCP is what David Parnas really meant by information hiding"と述べている[2]。
[編集] 関連項目
[編集] 参考資料
- ^ Martin 1996
- ^ Larman, Craig (May/June 2001). “Protected Variation: The Importance of Being Closed” (PDF). IEEE: 89-91.
- Meyer, Bertrand (1988). Object-Oriented Software Construction. Prentice Hall. ISBN 978-0136290315.
- Martin, Robert C. (January 1996). “The Open-Closed Principle” (PDF). C++ Report.