La sustitución de Liskov fue introducida por Barbara Liskov , foto tomada en 2010.
El principio de sustitución de Liskov ( LSP ) es una definición particular de una relación de subtipificación , llamada subtipificación conductual fuerte , que fue introducida inicialmente por Barbara Liskov en un discurso de apertura de una conferencia de 1987 titulada Abstracción y jerarquía de datos . Se basa en el concepto de "sustituibilidad", un principio de programación orientada a objetos que establece que un objeto (como una clase ) puede ser reemplazado por un subobjeto (como una clase que extiende la primera clase) sin romper el programa. 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 sucintamente en un artículo de 1994 de la siguiente manera: [1]
Requisito de subtipo : Sea una propiedad demostrable sobre objetos de tipo T. Entonces debería ser cierto para objetos de tipo S donde S es un subtipo de T .
Simbólicamente:
Es decir, si S subtipo T, lo que es válido para los objetos T es válido para los objetos S. 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 , postcondiciones e invariantes .
Principio
La noción de Liskov de 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 ).
La subtipificación conductual es una noción más sólida que la subtipificación típica de funciones definidas en la teoría de tipos , que se basa únicamente en la contravarianza de los tipos de parámetros y la covarianza del tipo de retorno. La subtipificación 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 sea cierto para algún subtipo S de T , incluso si q sí se cumple para T. No obstante, el principio es útil para razonar sobre el diseño de jerarquías de clases.
El principio de sustitución de Liskov impone algunos requisitos estándar sobre las firmas que se han adoptado en los lenguajes de programación orientados a objetos más nuevos (normalmente a nivel de clases en lugar de tipos; consulte subtipos nominales versus estructurales para conocer la distinción):
Contravarianza de los tipos de parámetros del método en el subtipo.
Covarianza de los tipos de retorno del método en el subtipo.
Los métodos del subtipo no pueden generar nuevas excepciones, excepto si son subtipos de excepciones lanzadas por los métodos del supertipo.
Además de los requisitos de firma, el subtipo debe cumplir una serie de condiciones de comportamiento. Estos se detallan en una terminología similar a la de la metodología de diseño por contrato , lo que genera algunas restricciones sobre cómo los contratos pueden interactuar con la herencia :
Restricción histórica (la "regla histórica"). Se considera que los objetos son modificables sólo a través de sus métodos ( encapsulación ). Debido a que los subtipos pueden introducir métodos que no están presentes en el supertipo, la introducción de estos métodos puede permitir cambios de estado en el subtipo que no están permitidos en el supertipo. La restricción histórica lo prohíbe. Fue el elemento novedoso introducido por Liskov y Wing. Una violación de esta restricción se puede ejemplificar definiendo un punto mutable como un subtipo de un punto inmutable . Esto es una violación de la restricción histórica, porque en la historia del punto inmutable , el estado es siempre el mismo después de la creación, por lo que no puede incluir la historia de un punto mutable en general. Sin embargo, los campos agregados al subtipo se pueden modificar de forma segura porque no son observables mediante los métodos de supertipo. Por lo tanto, se puede definir un círculo con centro inmutable y radio mutable como un subtipo de un punto inmutable sin violar la restricción histórica.
Orígenes
Las reglas sobre condiciones previas y posteriores son idénticas a las introducidas por Bertrand Meyer en su libro de 1988 Construcción de software orientada a objetos . Tanto Meyer como, más tarde, Pierre America, que fue el primero en utilizar el término subtipo conductual , dieron definiciones basadas en la teoría de la prueba de algunas nociones de subtipo conductual, pero sus definiciones no tuvieron en cuenta los alias que pueden ocurrir en los lenguajes de programación que admiten referencias o punteros. . Tener en cuenta el alias fue la principal mejora realizada por Liskov y Wing (1994), y un ingrediente clave es la restricción histórica. Según las definiciones de Meyer y America, un punto mutable sería un subtipo conductual de un punto inmutable, mientras que el principio de sustitución de Liskov lo prohíbe.
SÓLIDO : la "L" en "SÓLIDO" significa principio de sustitución de Liskov
Referencias
^ Liskov, Bárbara; Ala, Jeannette (1 de noviembre de 1994). "Una noción conductual de subtipificación". Transacciones ACM sobre lenguajes y sistemas de programación . 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172.
Bibliografía
Referencias específicas
Liskov, B. (1987). "Discurso de apertura: abstracción y jerarquía de datos" . OOPSLA '87: Anexo a las actas sobre sistemas, lenguajes y aplicaciones de programación orientada a objetos (Anexo) . págs. 17–34. doi :10.1145/62138.62141. ISBN 0897912667.Un discurso de apertura en el que Liskov formuló por primera vez el principio.
Levaduras, Gary T .; Dhara, Krishna K. (2000). "Conceptos de subtipificación del comportamiento y un bosquejo de su extensión a sistemas basados en componentes". En Levaduras, Gary T.; Sitaraman, Murali (eds.). Fundamentos de los sistemas basados en componentes . Prensa de la Universidad de Cambridge. ISBN 0-521-77164-1.Este artículo examina varias nociones de subtipificación conductual, incluidas las de Liskov y Wing.
Liskov, BH ; Wing, JM (noviembre de 1994). "Una noción conductual de subtipificación". Transmisión ACM. Programa. Lang. Sistema. 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172. Apareció una versión actualizada: Liskov, Barbara ; Wing, Jeannette (julio de 1999). Subtipos de comportamiento mediante invariantes y restricciones (informe técnico). Universidad de Carnegie mellon. CMU-CS-99-156.La formalización del principio por sus autores.
Plösch, Reinhold (2004). Contratos, escenarios y prototipos: un enfoque integrado para el software de alta calidad . Saltador. ISBN 3-540-43486-0.Contiene una introducción más suave a la subtipificación conductual en sus diversas formas en el capítulo 2.
Martín, Robert C. (marzo de 1996). "El principio de sustitución de Liskov" (PDF) . Informe C++ . Archivado desde el original (PDF) el 28 de noviembre de 2015.Un artículo popular en la comunidad de programación orientada a objetos que ofrece varios ejemplos de violaciones de LSP.
Majorinc, Kazimir. "Dilema elipse-círculo y herencia inversa". ITI 98, Actas de la 20ª Conferencia Internacional de Interfaces de Tecnología de la Información, Pula, 1998 . Interfaces de tecnología de la información, 2009. Iti '09. Actas de la 31ª Conferencia Internacional de Iti 2009 sobre. págs. 627–632. ISSN 1330-1012. OCLC 894960131.Este artículo analiza LSP en el contexto mencionado.
enlaces externos
Norvell, TS "El principio de sustitución de Liskov" (PDF) . Universidad Memorial de Ingeniería .
Samojin, Vadim (6 de junio de 2018). "Principio de sustitución de Liskov". Medio .
"Diseño de clases SÓLIDAS: el principio de sustitución de Liskov". Tom Dalling . 21 de noviembre de 2009.
Jobaer, Abu (31 de mayo de 2023). "LSP: principio de sustitución de Liskov". La puesta en marcha . Medio.