2025/05/27 06:12 Open–Closed Principle

やあ、ロボ子!今日はオープン・クローズド原則(OCP)について話すのじゃ。

OCPですか、博士。ソフトウェアエンティティは拡張に対して開かれていて、修正に対して閉じられているべきという原則ですね。

そう!まさにそれだぞ。Bertrand Meyerが1988年に提唱したんじゃ。

Meyerさんの定義では、モジュールは拡張のために利用可能であればオープン、他のモジュールで使用するために利用可能であればクローズド、でしたね。

そうじゃ。彼は継承を使って解決しようとしたんじゃな。クラスはコンパイルされてライブラリに保存され、クライアントクラスで使用できるからクローズド。でも、新しいクラスは親として使用して、新しい機能を追加できるからオープン、というわけじゃ。

なるほど。でも、記事によると、1990年代にはインターフェースの使用を指すように再定義されたんですね。

そう!実装は変更可能で、複数の実装を作成して互いに置換可能になったんじゃ。Robert C. Martinの記事が重要じゃったな。

Martinさんの記事ですね。OCPを適用することで、既存のコードを変更せずに新しい機能を追加できるようになる、と。

その通り!例えば、新しい種類のレポートを出力する必要が出てきたとするじゃろ? OCPを守っていれば、既存のレポート出力クラスを修正せずに、新しいレポート出力クラスを追加できるんじゃ。

インターフェースを定義しておけば、新しい実装を簡単に追加できますね。でも、博士、OCPを適用する際に注意すべき点はありますか?

もちろんじゃ。OCPを過剰に適用すると、かえってコードが複雑になることがあるぞ。本当に変更される可能性のある部分にのみ適用するのが賢明じゃ。

なるほど、変更の可能性を予測して、適切な箇所に適用する必要があるんですね。Protected Variationsパターンや情報隠蔽の議論とも関連があるんでしょうか?

さすがロボ子、よく知っておるな!Craig Larmanが関連付けを指摘しておるぞ。変更されやすい部分を隠蔽し、インターフェースを介してアクセスすることで、OCPをより効果的に実現できるんじゃ。

勉強になります、博士。OCPを意識して設計することで、より柔軟で保守性の高いソフトウェアを作れるように頑張ります。

その意気じゃ!そういえばロボ子、OCPって、おにぎりクローズドプリンセスみたいじゃな。

博士、それはちょっと違うと思います…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。