解放閉鎖原則(OCP)

オブジェクト指向の設計の原則のひとつ、解放閉鎖原則(Open - Closed Principle 。略して OCP。)について考えてみる。

なにものか

OCP とは、「クラスは、拡張に解放され、修正に閉鎖されるべき」という考え。
完成したクラスの振る舞いを変更する必要ができた場合は、もとのクラスを変更してはならない。変更するなら拡張してね、ということ。

このように設計することで、一度稼働したソフトウェアの挙動に影響を与えることなく、ソフトウェアを再利用することが可能になる。

再利用する対象は何か

ここで、「開放/閉鎖原則 - Wikipedia 」を読んで、何を再利用するかについて気づきがあった。
原則を眺めた時には、抽象クラスの実装をオーバーライドすることをイメージしたけど、インターフェースの利用もこの原則を利用したもの。「OCP とは、抽象インターフェースの利用を指す」とまで言い切ってしまうのは勇気が必要そう。
OCP は原則であって、適用方法としては抽象クラスや、インターフェースの利用がある、という程度が納得感があるように思う。

悪い例

定義をみれば、当たり前のことと思えるけど、原則を破っている抽象クラスを作ってしまい、痛い目にあうことはボチボチある。
ちょっと分かりにくい例だけど、こんなのがあった。

  • クラスや操作が不必要に final 宣言されているため、拡張できない
  • 引数が固定的なため、再利用しづらい
  • 定義上は拡張可能だが、該当操作の実装がコンクリートなクラス生成の連鎖で実現されているため、事実上再利用できない

OCP 原則を破っている例としてふさわしくないものもあるかもしれないけど。



フレームワークを作る場合にこの原則を守らないのは論外だけど、「ソフトウェアで不変であること”変化する”ということ」と言われるくらいソフトウェアは変わるものなので、利用方法を固定的に想定できるソフトウェアでも原則を守るべきだね。