Principio de segregación de interfaz

El Principio de segregación de interfaz es la siguiente parada en nuestro recorrido por los 5 principios sólidos. Afortunadamente, es bastante fácil de entender. Todo lo que significa es que no se debe obligar a un cliente a implementar una interfaz que nunca usará. Esta es la idea principal del Principio de segregación de interfaz. Al igual que el resto de los cinco patrones de diseño sólidos, el Principio de segregación de interfaz existe para ayudar a desacoplar los módulos dentro del software y hacer que el código sea más fácil de entender, refactorizar y mantener.

Diseño de interfaz

En este punto, sabemos cómo usar una interfaz en nuestros programas. Esto es genial, pero aún podemos encontrar problemas con las interfaces también. Es decir, con el principio de segregación de interfaces, queremos estar seguros de no llenar nuestras interfaces con el fregadero de métodos. Si agregamos demasiados métodos a nuestras interfaces, se vuelven demasiado gordos y comenzamos a perder algunos de los beneficios del sólido que estamos tratando de lograr. Como siempre, echemos un vistazo a algún código para ver a qué nos referimos.

Para comenzar, tenemos una Lumberghclase que tiene un harassmétodo que depende de una Underlingfunción. Podemos ver que una Underlingdebe ser capaz de programfiletpscollateHasta ahora todo bien, pensamos. Lumberghes capaz de ayudar a harasslos nuevos subordinados que se cruzan en su camino. Ahora, ¿qué sucede cuando Lumbergh necesita traer algunos consultores a Initech? ¿Cómo se desarrollará eso? Lumbergh debería poder acosar tanto a los subordinados como a los consultores con igual impunidad. Bueno, tal vez podamos configurar una interfaz y hacer que los subordinados y consultores implementen esa interfaz para que Lumbergh pueda acosarlos. Probémoslo.

Tenemos un pequeño problema. Tanto nuestro Underlingcomo las Consultantclases implementan el UnderlingInterfaceLos consultores, sin embargo , no cotejan . El problema es que, dado que un Consultor implementa de hecho la Interfaz Underling, y dado que la Interfaz Underling especifica que debemos ser capaces de programar, filetps y cotejar, entonces debemos obligar al Consultor a implementar esta parte de la interfaz que nunca utilizar . Aquí está nuestro nuevo programa actualizado, que funciona, pero viola el Principio de segregación de interfaz (el consultor se ve obligado a implementar el collatemétodo).

¿Cómo podemos hacerlo mejor?

lumbergh
La solución a un problema de ISP es dividir la interfaz en partes más pequeñas. De hecho, está bien tener una interfaz que solo tenga un método. El problema surge cuando tiene una interfaz que solo tiene método tras método tras método tras método que uno debe implementar. Cuantos más métodos necesiten implementarse, mayor será la posibilidad de efectos de onda en su programa.

En primer lugar, podemos romper nuestra UnderlingInterfaceen una ProgrammableInterfaceFiletpsableInterfaceCollatableInterface.

No es ideal

Mejor

Ahora podemos actualizar nuestras clases UnderlingConsultantpara implementar solo las interfaces que necesitan.

La implementación final

Estamos bastante cerca de donde tenemos que estar en este punto, pero tenemos que volver a la Lumberghclase original Tal como está ahora, la clase Lubergh necesitará hacer una verificación de tipo en la instancia que se pasa. Debe comprobar si se trata de un subordinado o un consultor. La razón de esto es que Lumbergh no puede llamar a un método de intercalación en un tipo de Consultor. ¡Recuerde que se supone que no tenemos que hacer esto! Si necesitamos hacer una verificación de tipo para determinar el comportamiento, es probable que estemos rompiendo algo en el sólido conjunto de principios de diseño. Esto significa que necesitamos una interfaz más. Configuraremos esto para que no importa lo que se pase a la clase Lumbergh, solo se deba realizar un comportamiento, y ese es answer_to_Lumbergh()Así es como lo hacemos.

Pasar en un Underlingda el resultado deseado

Pasar en un Consultanttambién da el resultado deseado

Resumen del principio de segregación de interfaces

No obligue a las clases a implementar comportamientos o una interfaz que nunca usarán. ¡Es así de simple!