Progettare per ereditarietà e polimorfismo

Programmazione orientata agli oggetti in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfismo

 

 

Usare un'interfaccia unificata per operare su oggetti di classi diverse

Programmazione orientata agli oggetti in Python

gerarchia delle classi account

Programmazione orientata agli oggetti in Python

Conta solo l'interfaccia

# Preleva importo da ciascun account in list_of_accounts
def batch_withdraw(list_of_accounts, amount):
   for acct in list_of_accounts:
      acct.withdraw(amount)

b, c, s = BankAccount(1000), CheckingAccount(2000), SavingsAccount(3000) batch_withdraw([b,c,s]) # <-- Userà BankAccount.withdraw(), # poi CheckingAccount.withdraw(), # poi SavingsAccount.withdraw()
  • batch_withdraw() non ha bisogno di controllare l'oggetto per sapere quale withdraw() chiamare
Programmazione orientata agli oggetti in Python

Principio di sostituzione di Liskov

 

La classe base deve essere intercambiabile con qualsiasi sua sottoclasse senza alterare le proprietà del programma

Ovunque funzioni BankAccount, dovrebbe funzionare anche CheckingAccount

foto di Barbara Liskov

Programmazione orientata agli oggetti in Python

Principio di sostituzione di Liskov

 

La classe base deve essere intercambiabile con qualsiasi sua sottoclasse senza alterare le proprietà del programma

Sintatticamente
  • le firme delle funzioni sono compatibili
    • argomenti, valori restituiti
Semanticamente
  • lo stato dell'oggetto e del programma rimane coerente
    • il metodo della sottoclasse non rafforza le condizioni di input
    • il metodo della sottoclasse non indebolisce le condizioni di output
    • nessuna eccezione aggiuntiva
Programmazione orientata agli oggetti in Python

Violazione del LSP

Incompatibilità sintattica

BankAccount.withdraw() richiede 1 parametro, ma CheckingAccount.withdraw() ne richiede 2

Rafforzamento delle condizioni di input nella sottoclasse

BankAccount.withdraw() accetta qualsiasi importo, ma CheckingAccount.withdraw() presume che l'importo sia limitato

Indebolimento delle condizioni di output nella sottoclasse

BankAccount.withdraw() può lasciare solo un saldo positivo o causare un errore, CheckingAccount.withdraw() può lasciare il saldo negativo

Programmazione orientata agli oggetti in Python

Violazione del LSP

→ Modifica di attributi aggiuntivi nel metodo della sottoclasse

→ Lancio di eccezioni aggiuntive nel metodo della sottoclasse

Programmazione orientata agli oggetti in Python

 

 

 

 

$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$

Programmazione orientata agli oggetti in Python

Facciamo pratica!

Programmazione orientata agli oggetti in Python

Preparing Video For Download...