yoongrammer

개방-폐쇄 원칙 (OCP: Open-Closed Principle) 본문

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를 위반하는 코드입니다.

    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
    Comments