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

自分で練習してみよう: Pythonオンラインコンパイラ