{"id":823,"date":"2022-02-04T00:00:00","date_gmt":"2022-02-03T23:00:00","guid":{"rendered":"https:\/\/programaraciegas.net\/?p=823"},"modified":"2022-01-02T11:14:19","modified_gmt":"2022-01-02T10:14:19","slug":"solid-principio-de-abierto-cerrado-u-open-closed-principle","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=823","title":{"rendered":"SOLID: Principio de abierto\/cerrado u Open\/closed principle"},"content":{"rendered":"<p>Como vimos en el art\u00edculo de <a href=\"https:\/\/programaraciegas.net\/?p=816\">los principios SOLID<\/a> este es el segundo principio.<\/p>\n<h2>Significado<\/h2>\n<p>Este principio Establece que las clases deben estar abiertas para su extensi\u00f3n, pero cerradas para su modificaci\u00f3n.<\/p>\n<h2>Ejemplo<\/h2>\n<p>Siguiendo con el ejemplo de la clase Persona que vimos en el art\u00edculo del <a href=\"https:\/\/programaraciegas.net\/?p=818\">principio de responsabilidad \u00fanica<\/a> imaginemos que <span style=\"font-family: Helvetica;\">tenemos una lista de personas(array) y queremos imprimir por pantalla las personas que tengan la edad suficiente para conducir un veh\u00edculo. Pero debemos tener en cuenta que seg\u00fan el pa\u00eds esta edad puede ser distinta. Para completar este programa crearemos una clase\u00a0ListaDePersonasMayoresDeEdad que resolver\u00e1 este problema con la funci\u00f3n\u00a0imprimeConductores().<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">Para el ejemplo de c\u00f3digo en lugar de cargar los datos de personas de la base de datos tendremos una lista que se rellenar\u00e1 en el constructor de la clase\u00a0ListaDePersonasMayoresDeEdad.<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">El c\u00f3digo de ejemplo quedar\u00eda as\u00ed:<\/span><\/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;\">    funcion calculaEdad()<\/span><\/span><br \/><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">class ListaDePersonasMayoresDeEdad {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 propiedad listaDePersonas<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 funcion Constructor() {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 listaDePersonas = [<\/span><\/p>\n<p><span style=\"font-family: Menlo;\"><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cFulano\u201d,\u00a0\u201cDe tal\u201d, Espa\u00f1ol, 1\/5\/1981),<\/span><\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cMengano\u201d,\u00a0\u201cDe cual\u201d, Mejicano, 3\/12\/1992),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cJohn\u201d,\u00a0\u201cDoe\u201d, Norteamericano, 13\/2\/2012),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cBoris\u201d,\u00a0\u201cStalin\u201d, Ruso, 20\/9\/1999)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 funcion imprimeConductores() {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 bucle personaDeLaLista en\u00a0listaDePersonas {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si\u00a0personaDeLaLista.nacionalidad = Espa\u00f1ol Y\u00a0personaDeLaLista.calculaEdad() &gt;= 18<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 entonces imprime(personaDeLaLista)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si\u00a0personaDeLaLista.nacionalidad = Norteamericano Y\u00a0personaDeLaLista.calculaEdad() &gt;= 16<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 entonces imprime(personaDeLaLista)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si\u00a0personaDeLaLista.nacionalidad = Ruso Y\u00a0personaDeLaLista.calculaEdad() &gt;= 18<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 entonces imprime(personaDeLaLista)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Helvetica;\">Este programa no cumple el principio de abierto\/cerrado por la sencilla raz\u00f3n de la necesidad de modificar la clase\u00a0ListaDePersonasMayoresDeEdad cada vez que haya una nacionalidad nueva en nuestra base de datos. La funci\u00f3n\u00a0imprimeConductores() tendr\u00eda que ser modificada cada vez que en la base de datos apareciese un usuario con una nueva nacionalidad.<\/span><\/p>\n<h2><span style=\"font-family: Helvetica;\">Soluci\u00f3n<\/span><\/h2>\n<p><span style=\"font-family: Helvetica;\">Dependiendo de las caracter\u00edsticas y las capacidades del lenguaje de programaci\u00f3n que estemos utilizando la soluci\u00f3n puede crearse mediante clases abstractas, protocolos o empleando una soluci\u00f3n generalista como la creaci\u00f3n de una clase nacionalidad que encapsule ciertos requisitos en la base de datos.<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">El objetivo de la soluci\u00f3n se enfoca en evitar tener que modificar una funci\u00f3n o clase en el futuro simplemente porque se agreguen nuevos datos a la base de datos.<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">Recordemos que este principio nos mueve a extender una clase para evitar estar modificando otra constantemente. Por esa raz\u00f3n podemos extender la clase Persona gracias a la nueva clase Nacionalidad<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">Veamos el c\u00f3digo de esta soluci\u00f3n.<\/span><\/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;\">    funcion calculaEdad()<\/span><\/span><br \/><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">class Nacionalidad {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 propiedad nombreDeNacionalidad<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 propiedad edadParaConducir<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">class ListaDePersonasMayoresDeEdad {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 propiedad listaDePersonas<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 propiedad nacionalidades<\/span>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 funcion Constructor() {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 nacionalidades = [<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Nacionalidad(Espa\u00f1ol , 18),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Nacionalidad(Norteamericano , 21),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Nacionalidad(Mejicano , 15),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Nacionalidad(Ruso , 18),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 listaDePersonas = [<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cFulano\u201d,\u00a0\u201cDe tal\u201d, Espa\u00f1ol, 1\/5\/1981),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cMengano\u201d,\u00a0\u201cDe cual\u201d, Mejicano, 3\/12\/1992),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cJohn\u201d,\u00a0\u201cDoe\u201d, Norteamericano, 13\/2\/2012),<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Persona(\u201cBoris\u201d,\u00a0\u201cStalin\u201d, Ruso, 20\/9\/1999)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 funcion imprimeConductores() {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 bucle personaDeLaLista en\u00a0listaDePersonas {<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Si personaDeLaLista.calculaEdad() &gt;=\u00a0<\/span><span style=\"font-family: Menlo;\">personaDeLaLista.nacionalidad.<\/span><span style=\"font-family: Menlo;\">edadParaConducir<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 entonces imprime(personaDeLaLista)<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Helvetica;\">Ahora el bucle que hay en la funci\u00f3n\u00a0imprimeConductores() se ha reducido y es m\u00e1s legible.<\/span><\/p>\n<p><span style=\"font-family: Helvetica;\">Esta soluci\u00f3n es m\u00e1s f\u00e1cil de mantener y facilita que la clase Nacionalidad pueda incorporar m\u00e1s informaci\u00f3n interesante para nuestra aplicaci\u00f3n y su mantenimiento ha mejorado al no existir la necesidad de modificar eternamente una funci\u00f3n de una clase concreta dependiendo de qu\u00e9 datos hay en la base de datos.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como vimos en el art\u00edculo de los principios SOLID este es el segundo principio. Significado Este principio Establece que las clases deben estar abiertas para su extensi\u00f3n, pero cerradas para su modificaci\u00f3n. Ejemplo Siguiendo con el ejemplo de la clase Persona que vimos en el art\u00edculo del principio de responsabilidad \u00fanica imaginemos que tenemos una &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=823\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abSOLID: Principio de abierto\/cerrado u Open\/closed 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-823","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\/823","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=823"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/823\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}