출처 : https://www.pythontutorial.net/python-oop/python-open-closed-principle/
Introduction to the open-closed principle
SOLID는 Uncle Bob에 의한 5 가지 소프트웨어 디자인 원칙을 나타내는 약어입니다.
- S – Single responsibility Principle
- O – Open-closed Principle
- L – Liskov Substitution Principle
- I – Interface Segregation Principle
- D – Dependency Inversion Principle
Open-closed Principle (개방-폐쇄 원칙)은 클래스, 메서드 및 함수가 확장을 위해 열려 있어야 하지만 수정을 위해 닫혀 있어야 함을 나타냅니다.
개방-폐쇄 원리는 모순적으로 들립니다.
개방-폐쇄 원칙의 목적은 기존 코드를 직접 수정하지 않고도 시스템에 새로운 기능(또는 사용 사례)을 쉽게 추가할 수 있도록 하는 것입니다 .
다음 예제를 고려하십시오.
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'Person(name={self.name})'
class PersonStorage:
def save_to_database(self, person):
print(f'Save the {person} to database')
def save_to_json(self, person):
print(f'Save the {person} to a JSON file')
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonStorage()
storage.save_to_database(person)
이 예제에서 PersonStorage 클래스에는 두 가지 메서드가 있습니다.
· save_to_database()메소드는 Person을 데이터베이스에 저장합니다.
· save_to_json()메소드는 Person을 JSON 파일에 저장합니다.
나중에 Person 개체의 개체를 XML 파일에 저장하려면 PersonStorage 클래스를 수정해야 합니다 . 이는 PersonStorage 클래스가 확장이 아니라 수정을 위해 열려 있음을 의미합니다. 따라서 개방-폐쇄 원칙을 위반합니다.
The open-closed principle example
PersonStorage 클래스가 개방-폐쇄 원칙을 따르도록 하려면 Person의 개체를 다른 파일 형식으로 저장해야 할 때 수정할 필요가 없도록 클래스를 디자인해야 합니다.
다음 클래스 다이어그램을 참조하십시오.
먼저 save() 추상 메서드를 포함하는 PersonStorage 추상 클래스를 정의합니다.
from abc import ABC, abstractmethod
class PersonStorage(ABC):
@abstractmethod
def save(self, person):
pass
둘째, Person 개체를 데이터베이스 및 JSON 파일에 저장하는 두 개의 클래스 PersonDB 및 PersonJSON을 만듭니다 . 이러한 클래스는 PersonStorage 클래스에서 상속됩니다.
class PersonDB(PersonStorage):
def save(self, person):
print(f'Save the {person} to database')
class PersonJSON(PersonStorage):
def save(self, person):
print(f'Save the {person} to a JSON file')
Person개체를 XML 파일에 저장하려면 다음과 같이 PersonStorage 클래스 에서 상속되는 새 클래스 PersonXML을 정의할 수 있습니다.
class PersonXML(PersonStorage):
def save(self, person):
print(f'Save the {person} to a JSON file')
그리고 PersonXML 클래스를 사용하여 Person의 개체를 XML 파일에 저장할 수 있습니다.
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonXML()
storage.save(person)
전체 Code
from abc import ABC, abstractmethod
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'Person(name={self.name})'
class PersonStorage(ABC):
@abstractmethod
def save(self, person):
pass
class PersonDB(PersonStorage):
def save(self, person):
print(f'Save the {person} to database')
class PersonJSON(PersonStorage):
def save(self, person):
print(f'Save the {person} to a JSON file')
class PersonXML(PersonStorage):
def save(self, person):
print(f'Save the {person} to a XML file')
if __name__ == '__main__':
person = Person('John Doe')
storage = PersonXML()
storage.save(person)
Summary
- open-closed principle(개방-폐쇄 원리)를 사용하면 확장을 위해 열려 있지만 수정을 위해 닫히도록 시스템을 설계 할 수 있습니다.
'Python Object-oriented Programming' 카테고리의 다른 글
Interface Segregation Principle (0) | 2023.04.04 |
---|---|
Liskov Substitution Principle (0) | 2023.04.04 |
Single Responsibility Principle (0) | 2023.04.04 |
enum-auto (0) | 2023.04.04 |
Customize and Extend Python Enum Class (0) | 2023.04.04 |
댓글