リスコフの置換
Coddyの「Clean Code - Pythonでより良いコードを書く」コースのレッスン 24/28。
「基底クラスへのポインタや参照を使用する関数は、それと意識することなく派生クラスのオブジェクトを使用できなければならない。」
この原則は、子クラスがその親クラスと置換可能でなければならないというものです。
例えば、
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')見ての通り、SMS と Email はどちらも Notification を継承していますが、一方は email に、もう一方は phone に送信しています。SMS クラスは親クラスである Notification と置換可能ではありません!
チャレンジ
中級リスコフの置換原則を適用するために、提供されたコードを修正してください -
- notify 関数は引数として message のみを受け取るようにしてください。
- Email と SMS は、それぞれ email と phone を初期化するコンストラクタを持つ必要があります。
- 変更を適用するためにコードを編集してください
これはリスコフの原則を適用するための一つの提案された解決策に過ぎません。他にも機能する解決策はあります!
自分で試してみよう
from abc import ABC, abstractmethod
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')
if __name__ == '__main__':
email = input()
phone = input()
message = input()
notification1 = Email()
notification2 = SMS()
notification1.notify(message, email)
notification2.notify(message, phone)