Principio di sostituzione di Liskov

particolare definizione di sottotipo

Nella programmazione orientata agli oggetti il principio di sostituzione di Liskov (Liskov substitution principle) è una particolare definizione di sottotipo, introdotta da Barbara Liskov e Jeannette Wing nel 1993.

La formulazione sintetica del principio è la seguente:

"Se è una proprietà che si può dimostrare essere valida per oggetti di tipo , allora deve essere valida per oggetti di tipo dove è un sottotipo di ."

Questa nozione di sottotipo è quindi basata sulla nozione di sostituibilità secondo cui, se S è un sottotipo di T, allora oggetti dichiarati in un programma di tipo T possono essere sostituiti con oggetti di tipo S senza alterare la correttezza dei risultati del programma.

Nella metodologia di programmazione chiamata progettazione per contratto (Design by contract), questo principio pone alcuni vincoli sulle modalità con cui i contratti possono interagire con l'ereditarietà:

  • i prerequisiti richiesti ad una superclasse devono essere almeno altrettanto vincolanti di quelli richiesti alle sottoclassi;
  • le postcondizioni e gli invarianti in una sottoclasse devono essere almeno altrettanto vincolanti di quelle delle sue superclassi.

Inoltre il principio non ammette la presenza di eccezioni più ampie nelle sottoclassi.

Un esempio di violazione del principio di sostituzione di Liskov

modifica

Un esempio tipico in cui viene violato il principio di Liskov (LSP d'ora in poi) è quello di una classe Quadrato che derivi da una classe Rettangolo. Si assume che i metodi setter e getter esistano per queste classi sia per la larghezza che per l'altezza. Per la classe Quadrato ci aspettiamo che larghezza ed altezza siano uguali. Se un oggetto Quadrato viene utilizzato in un contesto ove ci si aspetta sia usato un oggetto Rettangolo, si può verificare un comportamento inatteso perché le dimensioni (larghezza ed altezza) dell'oggetto Quadrato non possono e non dovrebbero essere modificate l'una indipendentemente dall'altra. Questo problema non può essere sistemato facilmente: se si modificano i metodi setter della classe Quadrato in modo tale che essi preservino le dimensioni uguali, allora questi metodi violeranno le postcondizioni per i metodi setter della classe Rettangolo, postcondizioni che affermano che per il rettangolo la larghezza e l'altezza possono variare in modo indipendente.

La violazione del principio LSP, come in questo caso, può rappresentare o no un problema nella pratica dipendentemente dalle postcondizioni o le invarianze attese dal codice che usa le classi che violano il principio LSP. Se Quadrato e Rettangolo hanno i soli metodi getter (cioè sono oggetti che non cambiano), non si verifica alcuna violazione del principio LSP.

Bibliografia

modifica
  • Liskov, B. H.; Wing, J. M. (November 1994). A behavioral notion of subtyping. ACM Trans. Program. Lang. Syst. 16 (6): 1811–1841. doi:10.1145/197320.197383. An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2006-10-05. The formalization of the principle by its authors.
  • Robert C. Martin, The Liskov Substitution Principle, C++ Report, March 1996. An article popular in the object-oriented programming community that gives several examples of LSP violations.

Voci correlate

modifica
  • SOLID - la "L" di "SOLID" sta per Liskov substitution

Collegamenti esterni

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica