Menu
Coddy logo textTech

リスコフの置換

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}')

見ての通り、SMSEmail はどちらも Notification を継承していますが、一方は email に、もう一方は phone に送信しています。SMS クラスは親クラスである Notification と置換可能ではありません!

challenge icon

チャレンジ

中級

リスコフの置換原則を適用するために、提供されたコードを修正してください -

- notify 関数は引数として message のみを受け取るようにしてください。

- EmailSMS は、それぞれ emailphone を初期化するコンストラクタを持つ必要があります。

- 変更を適用するためにコードを編集してください

 

これはリスコフの原則を適用するための一つの提案された解決策に過ぎません。他にも機能する解決策はあります!

自分で試してみよう

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でより良いコードを書くのすべてのレッスン