Sospecho que he cometido un error de escolar aquí, y estoy buscando una aclaración. Muchas de las clases en mi solución (C #), me atrevo a decir la mayoría, terminé escribiendo la interfaz correspondiente. Por ejemplo, una interfaz "ICalculator" y una clase "Calculator" que lo implementa, aunque es probable que nunca reemplace esa calculadora con una implementación diferente. Además, la mayoría de estas clases residen en el mismo proyecto que sus dependencias: realmente solo necesitan serlo internal
, pero terminaron siendo public
un efecto secundario de la implementación de sus respectivas interfaces.
Creo que esta práctica de crear interfaces para todo surgió de algunas falsedades:
1) Originalmente pensé que era necesaria una interfaz para crear simulacros de prueba unitaria (estoy usando Moq), pero desde entonces descubrí que una clase se puede burlar si sus miembros lo son virtual
, y tiene un constructor sin parámetros (corrígeme si Me equivoco).
2) Originalmente pensé que era necesaria una interfaz para registrar una clase con el marco IoC (Castle Windsor), p. Ej.
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
cuando de hecho podría registrar el tipo concreto contra sí mismo:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) El uso de interfaces, por ejemplo, parámetros del constructor para la inyección de dependencias, da como resultado un "acoplamiento flojo".
Entonces, ¿me he vuelto loco con las interfaces? Soy consciente de los escenarios en los que "normalmente" usaría una interfaz, por ejemplo, exponer una API pública, o para cosas como la funcionalidad "conectable". Mi solución tiene un pequeño número de clases que se ajustan a tales casos de uso, pero me pregunto si todas las demás interfaces son innecesarias y deberían eliminarse. Con respecto al punto 3) anterior, ¿no estaría violando el "acoplamiento flojo" si hiciera esto?
Editar : - Solo estoy jugando con Moq, y parece requerir métodos para ser públicos y virtuales, y tener un constructor público sin parámetros, para poder burlarse de ellos. ¿Entonces parece que no puedo tener clases internas?