1.✨ オープン・クローズドの原則とは?
オープン・クローズドの原則(OCP) とは、次の考え方です👇
「拡張には開いていて、修正には閉じている」
🤔 ちょっと難しいですよね。
噛み砕くとこうなります👇
🆕 新しい機能を追加するとき
-
👉 既存のコードを 書き換えずに追加できる
-
🛑 既存のコード👉 なるべく変更しない(バグの温床になるため)
つまり…
「機能追加のたびに if 文を増やしていませんか?」 😱
それ、OCPに違反しているかもしれませんよ。
😵 よくあるダメな例(OCP違反)
❌ if / switch が増え続けるコード
type Shape = "circle" | "square";
function calcArea(shape: Shape, value: number): number {
if (shape === "circle") {
return value * value * Math.PI;
}
if (shape === "square") {
return value * value;
}
return 0;
}
🚨 何が問題?
🔧 例えば、「三角形を追加したい!」
✏️ → この関数を修正する必要がある
😱 修正のたびにバグのリスクが上がる
// triangle を追加すると…
if (shape === "triangle") {
return value * value / 2;
}
👉 機能追加 = 既存コード修正
👉 ❌ OCP違反!
🌱 OCPを意識した設計にしてみよう!
ポイントはこれ👇✨
🧩 振る舞いを差し替えられるようにする
2. 🧱 共通のルール(interface)を作る
✅ 良い例:interface を使う 🧩✨
① 共通のルールを定義
interface Shape {
calcArea(): number;
}
② 各クラスが責任を持つ 🎯
class Circle implements Shape {
constructor(private radius: number) {}
calcArea(): number {
return this.radius * this.radius * Math.PI;
}
}
class Square implements Shape {
constructor(private size: number) {}
calcArea(): number {
return this.size * this.size;
}
}
③ 使う側は「Shape」だけを見る 👀✨
function printArea(shape: Shape) {
console.log(shape.calcArea());
}
printArea(new Circle(10));
printArea(new Square(5));
🎉 ここがすごい!
🆕 三角形を追加したい?
➕ 新しいクラスを作るだけ!
class Triangle implements Shape {
constructor(private base: number, private height: number) {}
calcArea(): number {
return (this.base * this.height) / 2;
}
}
👉 既存コードは一切修正なし! 🎊
👉 これが OCPを守った設計 です 🔒✨
🧠 OCPを一言で言うと?
💡
「変更に強いコードを書くための原則」
❌ if 文を増やして対応する
✅ クラスを追加して対応する
🔥 実務でのあるある
📈 機能追加が頻繁
😨 既存コード修正が怖い
🧨 修正したら別のところが壊れる
👉 OCPを意識すると
「安心して拡張できる設計」 になります ✨🛡️
3. 📦 第2回まとめ
🔓 拡張にはオープン
🔒 修正にはクローズ
🧩 interface + クラス分割が基本
🧠 if/switch が増え始めたら要注意!
4. 👉 次回予告 👀✨
次回は…
第3回:リスコフの置換原則(LSP) 🧬
「継承してるのに、安心して使えない…?」
そんなモヤっとを解消します 😄
ちなみに前回はこちら
5. おわりに
最後まで読んでいただき、ありがとうございます!🎉
この記事がみなさんの理解にすこしでも貢献できると、とてもうれしいです。
👍 いいね
💬 コメント
をもらえると、とても励みになります!
よかったら他の記事も是非ご覧ください。
次回も引き続きSOLID原則について勉強していきましょう 😊