Principio de sustitución de Liskov


La sustituibilidad es un principio en la programación orientada a objetos que establece que un objeto (como una clase ) y un subobjeto (como una clase que extiende la primera clase) deben ser intercambiables sin romper el programa.

Más formalmente, el principio de sustitución de Liskov ( LSP ) es una definición particular de una relación de subtipificación, denominada subtipificación conductual ( fuerte ) , que inicialmente presentó Barbara Liskov en un discurso de apertura de la conferencia de 1988 titulado Jerarquía y abstracción de datos . Es una relación semántica más que meramente sintáctica, porque pretende garantizar la interoperabilidad semántica de tipos en una jerarquía, tipos de objetos en particular. Barbara Liskov y Jeannette Wing describieron el principio de manera sucinta en un artículo de 1994 de la siguiente manera: [1]

Subtipo Requisito : Vamos a ser una propiedad comprobable acerca de los objetos de tipo T . Entonces debe ser cierto para los objetos de tipo S , donde S es un subtipo de T .

En el mismo artículo, Liskov y Wing detallaron su noción de subtipificación conductual en una extensión de la lógica de Hoare , que guarda cierta semejanza con el diseño por contrato de Bertrand Meyer en el sentido de que considera la interacción de la subtipificación con precondiciones , poscondiciones e invariantes .

La noción de Liskov de un subtipo conductual define una noción de sustituibilidad de objetos; es decir, si S es un subtipo de T , entonces los objetos de tipo T en un programa pueden ser reemplazados por objetos de tipo S sin alterar ninguna de las propiedades deseables de ese programa (por ejemplo, corrección ).

El subtipo de comportamiento es una noción más fuerte que el subtipo típico de funciones definidas en la teoría de tipos , que se basa solo en la contravarianza de los tipos de parámetros y la covarianza del tipo de retorno. El subtipo de comportamiento es indecidible en general: si q es la propiedad "el método para x siempre termina ", entonces es imposible para un programa (por ejemplo, un compilador) verificar que es cierto para algún subtipo S de T , incluso si q se cumple de t . No obstante, el principio es útil para razonar sobre el diseño de jerarquías de clases.