Menu
Coddy logo textTech

Sostituzione di Liskov

Lezione 24 di 28 del corso Codice pulito - Scrivi codice migliore con Python di Coddy.

"Le funzioni che usano puntatori o riferimenti alle classi base devono poter utilizzare oggetti delle classi derivate senza saperlo."

Questo principio afferma che una classe figlia deve poter essere sostituita alla sua classe genitore.

Per esempio,

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

Come puoi vedere, sia SMS sia Email ereditano da Notification, ma una invia a email e l'altra a phone: la classe SMS non può sostituire la sua classe genitore Notification!

challenge icon

Sfida

Medio

Correggi il codice dato per applicare il principio di sostituzione di Liskov -

- la funzione notify dovrebbe ricevere solo message come argomento.

- Email e SMS dovrebbero avere ciascuna un costruttore che inizializzi rispettivamente email e phone.

- modifica il codice per applicare i cambiamenti

 

Questa è solo una possibile soluzione per applicare il principio di Liskov; ce ne sono altre che funzionano!

Provalo tu

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)

Tutte le lezioni di Codice pulito - Scrivi codice migliore con Python

Esercitati da solo: Compilatore Python online