Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 잇츠디모
- 상가수익률계산기
- python 릿코드
- 릿코드풀이
- python sorted
- leetcode풀이
- 코틀린기초
- 파이썬 알고리즘
- 릿코드 파이썬
- python priority queue
- 파이썬알고리즘풀기
- 파이썬 릿코드
- python 알고리즘
- python xor
- python zip_longest
- 파이썬 알고리즘 풀기
- 알고리즘풀이
- 파이썬알고리즘
- 파이썬 프로그래머스
- 릿코드 풀기
- python Leetcode
- 릿코드
- binary search
- 파이썬릿코드풀기
- 릿코드풀기
- 파이썬릿코드
- LeetCode
- leetcode풀기
- 알고리즘풀기
- leetcode 풀기
Archives
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][SOLID] 개방/폐쇄 원칙 본문
반응형
개방/폐쇄 원칙 (Open-closed principle)
- 클래스는 확장에는 열려있고 수정(변경)에는 닫혀 있어야 한다.
- 기존 코드를 변경하지 않으면서, 기능을 수정하거나 추가할 수 있도록 설계되어야 한다는 원칙
개방/폐쇄 원칙은 기존의 시스템의 존재하는 코드의 수정없이 새로운 features(or use cases)를 쉽게 추가할 수 있습니다.
예제를 통해서 살펴 보겠습니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'name={self.name}, age={self.age}'
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')
person = Person('James', 28)
storage = PersonStorage()
storage.save_to_database(person)
위의 디자인에서 PersonStorage 클래스는 두 메소드를 지원합니다.
- save_to_database() 함수는 person을 database에 저장합니다.
- save_to_json() 함수는 person을 json 형태 파일로 저장합니다.
여기에서 xml 파일 형태로 저장하는 요구사항이 발생한다면? PersonStorage 클래스를 수정해야 한다. 즉, PersonStorage는 확장에 열려 있지 않고 수정에 열려있는 OCP를 위반하는 경우이다.
OCP 원칙에 맞춰서 클래스를 재 디자인 한다면 아래와 같다.
PersonStorage를 abstract class로 정의하고 save() 함수를 추상 함수로 정의한다.
from abc import ABC, abstractmethod
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'name={self.name}, age={self.age}'
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')
person = Person('James', 28)
storage = PersonDB()
storage.save(person)
OCP 원칙에 위배되지 않게 코드를 수정 하였습니다.
새로운 디자인에서 xml 파일 형식 저장 요구사항을 구현한다면 PersonStorage를 상속받은 PersonXML 클래스를 추가하면, 확장에는 열려 있고 수정에는 닫혀 있는 OCP 원칙을 충실히 지킨 디자인을 한 것입니다.
from abc import ABC, abstractmethod
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'name={self.name}, age={self.age}'
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')
person = Person('James', 28)
storage = PersonXML()
storage.save(person)
참고 자료:
반응형
'시스템 설계 및 디자인 > 객체지향 SOLID' 카테고리의 다른 글
[디자인패턴][SOLID] 의존성 역전 법칙 (0) | 2022.03.24 |
---|---|
[디자인패턴][SOLID] 인터페이스 분리 원칙 (0) | 2022.03.23 |
[디자인패턴][SOLID] 리스코프 치환 원칙 (0) | 2022.03.23 |
[디자인패턴][SOLID] 단일 책임 원칙 (0) | 2022.03.23 |
[디자인패턴] 객체 지향 5대 원칙 SOLID (0) | 2022.03.23 |
Comments