본문 바로가기
Python Object-oriented Programming

Open-closed Principle

by 자동매매 2023. 4. 4.

출처 : https://www.pythontutorial.net/python-oop/python-open-closed-principle/

 

Python Open–closed Principle

In this tutorial, you'll learn about the open-closed principle to add more functionality to the system without directly modifying existing code.

www.pythontutorial.net

 

 

Introduction to the open-closed principle

 

SOLID는 Uncle Bob에 의한 5 가지 소프트웨어 디자인 원칙 나타내는 약어입니다.

  •  – Single responsibility Principle
  • O  – Open-closed Principle
  •   Liskov Substitution Principle
  •   Interface Segregation Principle
  •   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)
test1.py
0.00MB

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

댓글