リスコフの置換
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 class は親である 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)
Clean Code - Pythonでより良いコードを書くのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ