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
- leetcode풀기
- 릿코드 파이썬
- python 알고리즘
- 잇츠디모
- 릿코드풀기
- 파이썬 알고리즘 풀기
- 릿코드
- python xor
- python zip_longest
- LeetCode
- 파이썬알고리즘
- 파이썬릿코드
- 릿코드 풀기
- 파이썬알고리즘풀기
- 파이썬 프로그래머스
- python sorted
- 파이썬 릿코드
- 상가수익률계산기
- 알고리즘풀기
- python 릿코드
- python Leetcode
- 알고리즘풀이
- 파이썬 알고리즘
- leetcode풀이
- 릿코드풀이
- python priority queue
- 파이썬릿코드풀기
- binary search
- leetcode 풀기
- 코틀린기초
Archives
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][SOLID] 리스코프 치환 원칙 본문
반응형
리스코프 치환 원칙 (Liskov substitution principle)
리스코프 치환 원칙은 자식 클래스는 그의 부모 클래스를 대체할 수 있어야 한다고 합니다. 자식 클래스가 오류를 일으키지 않고 부모 클래스를 대신할 수 있도록 하는 것을 목표로 합니다. 자식 클래스는 부모 클래스의 행동 규약을 위반하면 안되는 것입니다.
어떤 경우에 리스코프 치환 원칙이 위반 될까요?
- 자식 클래스가 부모 클래스의 변수 타입을 변경
- 자식 클래스가 부모 클래스의 함수의 리턴 타입이나 파라미터를 변경
- 자식 클래스가 부모 클래스의 함수를 원래 의도와 다르게 오버라이딩
글 보다는 코드로 이해하는 것이 더 빠릅니다.
from abc import ABC, abstractmethod
class Notificatioin(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notificatioin):
def notify(self, message, email):
print(f'send {message} to {email}')
class SMS(Notificatioin):
def notify(self, message, phone):
print(f'send {message} to {phone}')
notification = SMS()
notification.notify('hello world', 'james@abc.com')
위 예제에는 세 가지 클래스가 있습니다. Notification, EMail, SMS. Email과 SMS 클래스는 Notification 클래스를 상속 받았습니다. Email과 SMS는 message를 Notification의 notify() 함수를 통해서 전달하려는 것입니다.
EMail 클래스에서는 notify() 함수 사용에 문제가 없습니다. SMS 클래스에서는 notify() 함수의 두 번째 파라미터가 부모에서 정의한 email이 아니라 phone number 입니다. 그렇기 때문에 Notification의 notify() 함수를 올바르게 변경해야 합니다.
리스코프 치환 원칙을 준수해서 notify()함수를 수정합니다.
from abc import ABC, abstractmethod
class Notification(ABC):
@abstractmethod
def notify(self, message):
pass
class Email(Notification):
def __init__(self, email):
self.email = email
def notify(self, message):
print(f'send {message} to {self.email}')
class SMS(Notification):
def __init__(self, phone):
self.phone = phone
def notify(self, message):
print(f'send {message} to {self.phone}')
class Contact:
def __init__(self, name, email, phone):
self.name = name
self.email = email
self.phone = phone
class NotificationManager:
def __init__(self, notification):
self.notification = notification
def send(self, message):
self.notification.notify(message)
contact = Contact('James', 'jamese@abc.com', '010-1111-2222')
sms_notification = Email(contact.phone)
email_notification = Email(contact.email)
notification_manager = NotificationManager(sms_notification)
notification_manager.send('hello james')
notification_manager.notification = email_notification
notification_manager.send('hi james')
요약
- 리스코프 치환 원칙은, 자식 클래스는 반드시 그 부모 클래스를 대체할 수 있어야 한다.
참고한 자료:
Python Liskov Substitution Principle
반응형
'시스템 설계 및 디자인 > 객체지향 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