OOP
개방-폐쇄 원칙 (OCP: Open-Closed Principle)
yoongrammer
2022. 3. 3. 12:59
728x90
목차
개방-폐쇄 원칙 (OCP: Open-Closed Principle)
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.
Bertrand Mayer
계방 폐쇄 원칙은 기존 코드를 변경하지 않으면서(Close) 기능을 추가(Open)할 수 있도록 설계가 되어야 한다는 원칙입니다.
이 원칙을 지키기 위해서 주로 객체지향의 추상화와 다형성을 활용합니다.
OCP 적용 전
class File:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'File(name={self.name})'
class FileStorage:
def save_to_ORACLE(self, file):
print(f'Save the {file} to ORACLE')
def save_to_MySQL(self, file):
print(f'Save the {file} to MYSQL')
if __name__ == '__main__':
file = File('test')
storage = FileStorage()
storage.save_to_ORACLE(file)
이 예제에서 FileStorage 클래스에는 두 가지 메서드가 있습니다.
- save_to_ORACLE() : ORACLE DB에 파일을 저장합니다.
- save_to_MySQL() : MySQL DB에 파일을 저장합니다.
나중에 File을 새로운 DB에 저장하려면 FileStorage 클래스를 수정해야 합니다.
이는 FileStorage 클래스가 확장과 수정에 대해서 열려있다는 것을 보여주므로 OCP를 위반하는 코드입니다.
728x90
OCP 적용 후
from abc import *
class File:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'File(name={self.name})'
class FileStorage(ABC):
@abstractmethod
def save(self, person):
pass
class ORACLE(FileStorage):
def save(self, person):
print(f'Save the {person} to ORACLE')
class MySQL(FileStorage):
def save(self, person):
print(f'Save the {person} to MySQL')
save() 추상 메서드를 가지고 있는 FileStorage 추상 클래스를 정의하고, File객체를 저장하기 위한 ORACLE, MySQL 클래스를 만듭니다. 이 클래스는 FileStorage 클래스를 상속하고 있습니다.
File 객체를 MongoDB에 저장하고 싶다면 MongoDB class만 추가해 주면 됩니다.
class MongoDB(FileStorage):
def save(self, person):
print(f'Save the {person} to MongoDB')
그리고 MongoDB 클래스를 사용하여 File 객체를 MongoDB에 저장할 수 있습니다.
if __name__ == '__main__':
file = File('test')
storage = MongoDB()
storage.save(file)
위와 같이 다형성을 사용한다면 FileStorage 클래스는 수정 없이 DB를 추가할 수 있게 되어 OCP를 따르게 할 수 있습니다.
결론
OCP는 해당 클래스의 기존 동작을 변경하지 않고 클래스의 동작을 확장하는 것을 목표로 합니다.
그리고 유지 관리 및 수정이 쉬운 코드를 작성하는데 필수적입니다.
하지만 OCP에 대한 과도한 설계는 불필요한 복잡성을 유발하기 때문에 적절히 사용해야 합니다.
728x90