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 titulado Abstracción y jerarquía de datos . Se basa en el concepto de "sustituibilidad", un principio de la 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 en lugar de meramente sintáctica, porque pretende garantizar la interoperabilidad semántica de los tipos en una jerarquía, en particular los tipos de objetos. 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 acerca de objetos del tipo T . Entonces debería ser verdadero para objetos del tipo S donde S es un subtipo de T .
La noción de Liskov de un subtipo de comportamiento define una noción de sustituibilidad de objetos; es decir, si S es un subtipo de T , entonces los objetos del tipo T en un programa pueden ser reemplazados por objetos del tipo S sin alterar ninguna de las propiedades deseables de ese programa (por ejemplo, la corrección ).
La subtipificación conductual es una noción más fuerte 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 conductual 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 cierta para algún subtipo S de T , incluso si q es cierta 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 lenguajes de programación orientados a objetos más nuevos (generalmente a nivel de clases en lugar de tipos; consulte subtipificación nominal vs. estructural para 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 lanzar 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. Estas 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 de historial (la "regla de historial"). Los objetos se consideran modificables solo a través de sus métodos ( encapsulamiento ). 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 de historial prohíbe esto. 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 de historial, porque en el historial del punto inmutable , el estado siempre es el mismo después de la creación, por lo que no puede incluir el historial de un punto mutable en general. Sin embargo, los campos agregados al subtipo pueden modificarse de manera segura porque no son observables a través de los métodos del 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 de historial.
Orígenes
Las reglas sobre precondiciones y poscondiciones son idénticas a las introducidas por Bertrand Meyer en su libro de 1988 Object-Oriented Software Construction . Tanto Meyer como, posteriormente, Pierre America, que fue el primero en utilizar el término subtipificación conductual , dieron definiciones teóricas de prueba de algunas nociones de subtipificación conductual, pero sus definiciones no tomaron en cuenta el aliasing que puede ocurrir en lenguajes de programación que admiten referencias o punteros. Tener en cuenta el aliasing fue la principal mejora realizada por Liskov y Wing (1994), y un ingrediente clave es la restricción de historial. 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.
SOLID – la "L" en "SOLID" representa el principio de sustitución de Liskov
Referencias
^ Liskov, Barbara; Wing, Jeannette (1 de noviembre de 1994). "Una noción conductual de subtipificación". ACM Transactions on Programming Languages and Systems . 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172.
Bibliografía
Referencias específicas
Liskov, B. (1987). Discurso inaugural: abstracción y jerarquía de datos . OOPSLA '87: Adenda a las Actas sobre sistemas, lenguajes y aplicaciones de programación orientada a objetos (Adenda) . pp. 17–34. doi :10.1145/62138.62141. ISBN 0897912667.Un discurso inaugural en el que Liskov formuló por primera vez el principio.
Leavens, Gary T .; Dhara, Krishna K. (2000). "Conceptos de subtipificación conductual y un esbozo de su extensión a sistemas basados en componentes". En Leavens, Gary T.; Sitaraman, Murali (eds.). Fundamentos de los sistemas basados en componentes . Cambridge University Press. ISBN 0-521-77164-1.En este artículo se examinan diversas nociones de subtipificación del comportamiento, incluidas las de Liskov y Wing.
Liskov, BH ; Wing, JM (noviembre de 1994). "Una noción conductual de subtipificación". ACM Trans. Program. Lang. Syst. 16 (6): 1811–41. doi : 10.1145/197320.197383 . S2CID 999172. Apareció una versión actualizada: Liskov, Barbara ; Wing, Jeannette (julio de 1999). Subtipificación del comportamiento mediante invariantes y restricciones (informe técnico). Carnegie Mellon University. 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 . Springer. ISBN 3-540-43486-0.Contiene una introducción más suave a la subtipificación del comportamiento en sus diversas formas en el capítulo 2.
Martin, Robert C. (marzo de 1996). "El principio de sustitución de Liskov" (PDF) . Informe de 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 brinda varios ejemplos de violaciones de LSP.
Majorinc, Kazimir. "El dilema elipse-círculo y herencia inversa". ITI 98, Actas de la 20.ª Conferencia internacional sobre 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 sobre interfaces de tecnología de la información de Iti 2009. 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) . Engineering Memorial University .
Samokhin, Vadim (6 de junio de 2018). "Principio de sustitución de Liskov". Medium .
"Diseño de clases SOLID: 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". The Startup . Medium.