0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SOLID原則② 】オープン・クローズドの原則(Open-Closed Principle)🔓🔒

0
Last updated at Posted at 2026-01-14

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原則について勉強していきましょう 😊

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?