KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

Python基礎 オブジェクト指向SOLID(オープンクローズドの原則)

登録日 :2025/09/16 04:53
カテゴリ :Python基礎

O: Open Closed(オープンクローズドの原則)

オープンクローズドの原則

ソフトウェアの構成要素は、拡張に対して開かれていて、修正に対して閉じていなければならない

1.拡張に対して開かれている
  • 機能の拡張
  • 新たなコードを追加することで機能を拡張することができる
2.修正に対して閉じている
  • 機能を拡張するための既存コードの修正
  • 拡張によって既存コードが修正されない

機能を拡張するときに、既存コードが修正されないようにする。
ソフトウェアの振る舞いは既存の成果物を変更せずに拡張できるようにする。

オープンクローズドの原則を適用すべきケース

種別によって振る舞いの変更が必要な場合
例)会員ランク
- bronze : 1ポイント
- Silver : 2ポイント
- Gold : 3ポイント
例)データの保存先
- RDB
- NoSQL
- CSV File

種別の拡張があった場合でも、既存のコードを変更することなく対応可能とする


サンプルプログラム

import math
from abc import ABCMeta, abstractmethod


class IEmployee(metaclass=ABCMeta):
    def __init__(self, _name: str):
        self.name = _name

    @abstractmethod
    def get_bonus(self, base: int) -> int:
        pass


class JuniorEmployee(IEmployee):
    def get_bonus(self, base: int) -> int:
        return math.floor(base * 1.1)


class MiddleEmployee(IEmployee):
    def get_bonus(self, base: int) -> int:
        return math.floor(base * 1.2)


class SeniorEmployee(IEmployee):
    def get_bonus(self, base: int) -> int:
        return math.floor(base * 1.3)


class ExpertEmployee(IEmployee):
    def get_bonus(self, base: int) -> int:
        return math.floor(base * 3)


if __name__ == '__main__':
    junior = JuniorEmployee('Suzuki')
    middle = MiddleEmployee('Tanaka')
    senior = SeniorEmployee('Sakai')
    expert = ExpertEmployee('Tagawa')

    print(f'{junior.name}:{junior.get_bonus(100)}')
    print(f'{middle.name}:{middle.get_bonus(100)}')
    print(f'{senior.name}:{senior.get_bonus(100)}')
    print(f'{expert.name}:{expert.get_bonus(100)}')