{"id":826,"date":"2022-02-11T00:00:00","date_gmt":"2022-02-10T23:00:00","guid":{"rendered":"https:\/\/programaraciegas.net\/?p=826"},"modified":"2022-01-02T12:24:31","modified_gmt":"2022-01-02T11:24:31","slug":"solid-principio-de-substitucion-de-liskov-o-liskov-substitution-principle","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=826","title":{"rendered":"SOLID: Principio de substituci\u00f3n de Liskov o Liskov substitution principle"},"content":{"rendered":"<p>Este es el tercer principio de <a href=\"https:\/\/programaraciegas.net\/?p=816\">los principios de programaci\u00f3n SOLID<\/a> y se relaciona con una caracter\u00edstica de la programaci\u00f3n orientada a objetos: la Herencia.<\/p>\n<h2>Significado<\/h2>\n<p>El principio Declara que una subclase debe ser sustituible por su superclase.<\/p>\n<p>Si en nuestro programa al hacer esto la aplicaci\u00f3n falla, estaremos incumpliendo este principio SOLID.<\/p>\n<p>Cumpliendo con este principio se confirmar\u00e1 que nuestro programa tiene una jerarqu\u00eda de clases f\u00e1cil de entender y un c\u00f3digo reutilizable.<\/p>\n<p>Ejemplo<\/p>\n<p>Siguiendo con los ejemplos de los art\u00edculos de <a href=\"https:\/\/programaraciegas.net\/?p=818\">Principio de responsabilidad \u00fanica<\/a> y el\u00a0<a href=\"https:\/\/programaraciegas.net\/?p=823\">Principio de abierto\/cerrado<\/a> imaginemos que queremos controlar si una persona puede acceder a una sala restringida s\u00f3lo a ciertos trabajadores. En nuestro ejemplo tendremos operarios, t\u00e9cnicos, estudiantes, jefes y guardias y s\u00f3lo los guardias y los jefes podr\u00e1n acceder a la sala de control ya que estas dos clases incluyen la funci\u00f3n\u00a0<span style=\"font-size: 12px; font-family: Menlo;\">entraEnSalaDeControl()<\/span>. Realizaremos esta gesti\u00f3n en la clase ControlarAcceso que contiene una funci\u00f3n para imprimir si tiene acceso o no a la sala.<\/p>\n<p>A esta funci\u00f3n se le pasa como par\u00e1metro(array) una lista de objetos de la clase Persona.<\/p>\n<p>Veamos el c\u00f3digo.<\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad apellidos<br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad nacionalidad<\/span><\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad fechaDeNacimiento<\/p>\n<p><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion calculaEdad()<\/span><\/span><br \/><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Operario: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDeIdentificaci\u00f3n<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion utilizaHerramienta()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion tomaUnDescanso()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class T\u00e9cnico: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDeIdentificaci\u00f3n<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion utilizaHerramienta()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion revisaOperario()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion controlaCalidad()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion tomaUnDescanso()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Jefe: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad departamento<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion revisaPersona()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion controlaCalidad()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion entraEnSalaDeControl() {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 imprime(\u201cJefe.nombre accede a la sala de control\u00bb)<\/span><\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 }<\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Guardia: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDePlaca<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion vigilaSala()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion arrestaPersona()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion entraEnSalaDeControl() {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 imprime(\u201cGuardia.nombre accede a la sala de control\u00bb)<\/span><\/span><\/p>\n<p>\u00a0 \u00a0 }<br \/><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class ControlarAcceso {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion imprimePermisos(<\/span><\/span><span style=\"font-size: 12px; font-family: Menlo;\">listaDePersonas: Array de Persona<\/span><span style=\"font-size: 12px; font-family: Menlo;\">) {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 Bucle personaDeLaLista en\u00a0<\/span><span style=\"font-size: 12px;\">listaDePersonas {<\/span><\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si personaDeLaLista esInstanciaDe Operario<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<span style=\"font-family: Menlo;\">ENTONCES imprime(\u201cpersonaDeLaLista.nombre no tiene acceso.\u00bb)<\/span><\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si personaDeLaLista esInstanciaDe T\u00e9cnico<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0ENTONCES imprime(\u201cpersonaDeLaLista.nombre no tiene acceso.\u00bb)<\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si personaDeLaLista esInstanciaDe Guardia<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0ENTONCES personaDeLaLista.<\/span><span style=\"font-size: 12px; font-family: Menlo;\">entraEnSalaDeControl()<\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si personaDeLaLista esInstanciaDe Jefe<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0ENTONCES\u00a0<\/span><span style=\"font-family: Menlo;\">personaDeLaLista.<\/span><span style=\"font-size: 12px; font-family: Menlo;\">entraEnSalaDeControl()<\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p>Este c\u00f3digo adem\u00e1s de incumplir el principio de abierto \/ cerrado incumple el principio de substituci\u00f3n de Liskov.<\/p>\n<p>Soluci\u00f3n<\/p>\n<p>Utilizando las propiedades de la Herencia en programaci\u00f3n orientada a objetos podemos incluir una funci\u00f3n entraEnSalaDeControl() con un valor por defecto de no acceso en la clase Persona.\u00a0<\/p>\n<p>Todas las clases hijas heredar\u00e1n esta funci\u00f3n por lo que s\u00f3lo habr\u00eda que sobreescribir esta funci\u00f3n en las clases que si tengan acceso.<\/p>\n<p>El c\u00f3digo quedar\u00eda de la siguiente forma.<\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad apellidos<br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad nacionalidad<\/span><\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 propiedad fechaDeNacimiento<\/p>\n<p><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion calculaEdad()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion entraEnSalaDeControl() {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 imprime(\u201cPersona.nombre no tiene acceso a la sala de control\u00bb)<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><\/p>\n<p>}<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Operario: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDeIdentificaci\u00f3n<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion utilizaHerramienta()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion tomaUnDescanso()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class T\u00e9cnico: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDeIdentificaci\u00f3n<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion utilizaHerramienta()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion revisaOperario()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion controlaCalidad()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion tomaUnDescanso()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Jefe: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad departamento<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion revisaPersona()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion controlaCalidad()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 SobreEscrito funcion entraEnSalaDeControl() {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 imprime(\u201cPersona.nombre accede a la sala de control\u00bb)<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Guardia: Persona {<\/span><br \/><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad numeroDePlaca<\/span><br \/><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\"><br \/><\/span><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion vigilaSala()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion arrestaPersona()<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 SobreEscribe funcion entraEnSalaDeControl() {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 imprime(\u201cPersona.nombre accede a la sala de control\u00bb)<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><br \/><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class ControlarAcceso {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 funcion imprimePermisos(<\/span><span style=\"font-size: 12px;\">listaDePersonas: Array de Persona<\/span><span style=\"font-size: 12px;\">) {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 Bucle personaDeLaLista en\u00a0<\/span><span style=\"font-size: 12px;\">listaDePersonas {<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 personaDeLaLista.<span style=\"font-size: 12px;\">entraEnSalaDeControl<\/span><\/span><\/p>\n<p><span style=\"font-size: 12px; font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p>Ahora la funci\u00f3n imprimePermisos no tiene que consultar a qu\u00e9 clase pertenece la persona de la lista ya que por contrato de herencia todas las clases hijas de Persona incluyen la funci\u00f3n entraEnSalaDeControl(). Esto facilita que si en el futuro es necesario agregar nuevas clases hijas de Persona s\u00f3lo habr\u00e1 que sobreescribir la funci\u00f3n en aquellas clases que si tengan acceso. De esta forma mejoramos el mantenimiento del proyecto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este es el tercer principio de los principios de programaci\u00f3n SOLID y se relaciona con una caracter\u00edstica de la programaci\u00f3n orientada a objetos: la Herencia. Significado El principio Declara que una subclase debe ser sustituible por su superclase. Si en nuestro programa al hacer esto la aplicaci\u00f3n falla, estaremos incumpliendo este principio SOLID. Cumpliendo con &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=826\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abSOLID: Principio de substituci\u00f3n de Liskov o Liskov substitution principle\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,6],"tags":[87,386,388],"class_list":["post-826","post","type-post","status-publish","format-standard","hentry","category-metodologiafilosofia","category-programacion","tag-programacion-2","tag-solid","tag-teoria"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=826"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/826\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}