開放/閉鎖原則

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

開放/閉鎖原則(かいほうへいさげんそく。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]

関連項目[編集]

参考資料[編集]

  1. ^ Martin 1996
  2. ^ Larman, Craig (May/June 2001). “Protected Variation: The Importance of Being Closed” (PDF). IEEE: 89-91. http://www.craiglarman.com/articles/The%20Importance%20of%20Being%20Closed%20-%20Larman%20-%20IEEE%20Software.pdf. 

外部リンク[編集]