Estaba revisando un artículo de Robert C. Martin y en un lugar dio un ejemplo como este:¿Por qué deberíamos colocar las interfaces con las clases que las usan en lugar de las que las implementan?
La primera imagen muestra que hay una dependencia cíclica entre los dos paquetes. Para eliminar esta dependencia, se agrega una nueva interfaz en la segunda imagen. B implementa la interfaz y Y lo usa. Y Martin hace que el siguiente punto:
interfaces son muy a menudo se incluyen en el paquete que los utiliza, en lugar de en el paquete que las implementa.
Mi pregunta es, ¿por qué deberíamos organizar las interfaces de esta manera? ¿Cuál es el razonamiento detrás de las interfaces de empaque de esta manera? De acuerdo con las clases del Principio de cierre común que cambian juntas deben permanecer juntas. ¿Hay una interfaz más cercana a su implementador o su usuario, en términos de cambio?
Pero las interfaces se pueden utilizar y se pueden implementar en diferentes módulos. En nuestra compañía, los almacenamos en un módulo separado que está siendo referenciado por todos ellos, esa forma en que son un módulo per se. Esto es importante para nosotros porque tenemos muchos, y me refiero a MUCHAS interfaces, y es más fácil mantener todo esto así ... aún más si tienes reglas de la compañía sobre quién puede comprometerse con alguna ruta en el repositorio. Y no todos pueden hacer cambios en las interfaces ... –
Pero luego, si la interfaz cambia, tendrá muchísimos cambios extendiéndose a través de tantos módulos, ¿no? –
FYI - http://martinfowler.com/eaaCatalog/separatedInterface.html. Esto pone la situación en una perspectiva más clara, creo. Es la necesidad de eludir la estructura de dependencia que puede causar una situación como esta. ¿Pero qué hay de los escenarios generales? –