{"id":828,"date":"2022-02-18T00:00:00","date_gmt":"2022-02-17T23:00:00","guid":{"rendered":"https:\/\/programaraciegas.net\/?p=828"},"modified":"2022-01-03T13:32:18","modified_gmt":"2022-01-03T12:32:18","slug":"solid-principio-de-segregacion-de-interfaz-o-interface-segregation-principle","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=828","title":{"rendered":"SOLID: Principio de segregaci\u00f3n de interfaz o Interface segregation principle"},"content":{"rendered":"<p>En este art\u00edculo hablamos del cuarto principio de <a href=\"https:\/\/programaraciegas.net\/?p=816\">los principios de programaci\u00f3n SOLID<\/a>.<\/p>\n<h2>Significado<\/h2>\n<p>Este principio establece que las clases clientes de otras no deber\u00edan verse forzados a depender de interfaces que no usan. En su lugar se apoya la definici\u00f3n de interfaces m\u00e1s espec\u00edficas para cada caso.<\/p>\n<p>Cuando hablamos de interfaces estamos hablando del concepto de interfaz de clase del lenguaje de programaci\u00f3n Java as\u00ed como la adaptaci\u00f3n a cualquier otro tipo de lenguaje de programaci\u00f3n. Por ejemplo en Swift estar\u00edamos hablando de protocolos.<\/p>\n<p>En pocas palabras una interface es un acuerdo entre las clases que implementan la interfaz y la propia interfaz definida con sus propiedades y funciones. El acuerdo consiste en que cada clase que implemente dicha interfaz deber\u00e1 codificar cada una de las propiedades y funciones definidas en la interfaz.<\/p>\n<h2>Ejemplo<\/h2>\n<p>Este principio es m\u00e1s sencillo de entender con un ejemplo.<\/p>\n<p>Imaginemos que estamos modelando una interfaz de acciones para distintas clases de aves.<\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">interface Ave {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Loro implements Ave {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para cantar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para volar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Aguila implements Ave {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 noHacerNada()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para volar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Gallina implements Ave {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para cantar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 noHacerNada()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p>En este ejemplo tenemos una interfaz llamada Ave con 3 acciones pero no todas las aves realizan esas tres acciones. Por ejemplo las \u00e1guilas no cantan y las gallinas no vuelan. Pero si una clase implementa una interfaz est\u00e1 obligada a incluir esas funciones aunque no hagan nada.<\/p>\n<h2>Soluci\u00f3n<\/h2>\n<p>La soluci\u00f3n consiste en segregar la interfaz Ave en 3 interfaces m\u00e1s espec\u00edficas.<\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">interface Ave {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">interface AveCantora {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">interface AveVoladora {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar()<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Loro implements Ave, AveCantora, AveVoladora {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para cantar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para volar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Aguila implements Ave, AveVoladora {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion volar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para volar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">class Gallina implements Ave, AveCantora {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad nombre<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad color<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 propiedad tama\u00f1o<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion comer() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para comer<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 funcion cantar() {<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 \u00a0 \u00a0 \/\/ c\u00f3digo para cantar<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">\u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"font-family: Menlo; font-size: 12px;\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p>Ahora cada clase s\u00f3lo implementa las interfaces necesarias a sus capacidades por lo que no hay funciones que no hacen nada.<\/p>\n<p>Con esta soluci\u00f3n es sencillo incluir en un futuro por ejemplo aves que puedan nadar y cada clase s\u00f3lo implementar\u00e1 las funciones necesarias.<\/p>\n<p>Adem\u00e1s con esta soluci\u00f3n se mejora a\u00fan m\u00e1s el principio de responsabilidad \u00fanica<a href=\"https:\/\/programaraciegas.net\/?p=818\">.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo hablamos del cuarto principio de los principios de programaci\u00f3n SOLID. Significado Este principio establece que las clases clientes de otras no deber\u00edan verse forzados a depender de interfaces que no usan. En su lugar se apoya la definici\u00f3n de interfaces m\u00e1s espec\u00edficas para cada caso. Cuando hablamos de interfaces estamos hablando del &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=828\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abSOLID: Principio de segregaci\u00f3n de interfaz o Interface segregation 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-828","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\/828","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=828"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/828\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}