Mis 2 centavos ...
Si y no.
Nunca deberías realmente violar los principios que adoptas; pero, sus principios siempre deben ser matizados y adoptados en servicio a un objetivo superior. Entonces, con una comprensión adecuadamente condicionada, algunas violaciones aparentes pueden no ser violaciones reales del "espíritu" o del "conjunto de principios en su conjunto".
Los principios SÓLIDOS en particular, además de requerir muchos matices, están en última instancia subordinados al objetivo de "entregar software funcional y mantenible". Por lo tanto, adherirse a cualquier principio SOLID en particular es contraproducente y contradictorio cuando hacerlo entra en conflicto con los objetivos de SOLID. Y aquí, a menudo me doy cuenta de que entregar la capacidad de mantenimiento triunfa .
Entonces, ¿qué pasa con la D en SÓLIDO ? Bueno, contribuye a una mayor capacidad de mantenimiento al hacer que su módulo reutilizable sea relativamente independiente de su contexto. Y podemos definir el "módulo reutilizable" como "una colección de código que planea usar en otro contexto distinto". Y eso se aplica a funciones individuales, clases, conjuntos de clases y programas.
Y sí, cambiar las implementaciones del registrador probablemente coloque su módulo en "otro contexto distinto".
Entonces, permítanme ofrecerles mis dos grandes advertencias :
Primero: Dibujar las líneas alrededor de los bloques de código que constituyen "un módulo reutilizable" es una cuestión de juicio profesional. Y su juicio se limita necesariamente a su experiencia.
Si actualmente no planea usar un módulo en otro contexto, probablemente esté bien que dependa indefensamente de él. La advertencia a la advertencia: sus planes probablemente estén equivocados, pero eso también está bien. Cuanto más tiempo escriba módulo tras módulo, más intuitivo y preciso será su sentido de si "necesitaré esto de nuevo algún día". Pero, probablemente nunca podrá decir retrospectivamente: "He modularizado y desacoplado todo en la mayor medida posible, pero sin excesos ".
Si se siente culpable por sus errores de juicio, confiese y continúe ...
En segundo lugar: invertir el control no equivale a inyectar dependencias .
Esto es especialmente cierto cuando comienzas a inyectar dependencias hasta la saciedad . La inyección de dependencia es una táctica útil para la estrategia global de IoC. Pero, diría que la DI es de menor eficacia que otras tácticas, como el uso de interfaces y adaptadores, puntos únicos de exposición al contexto desde dentro del módulo.
Y centrémonos realmente en esto por un segundo. Porque, incluso si inyecta una Logger
náusea ad , necesita escribir código en la Logger
interfaz. No podría comenzar a usar una nueva Logger
de un proveedor diferente que tome parámetros en un orden diferente. Esa capacidad proviene de la codificación, dentro del módulo, contra una interfaz que existe dentro del módulo y que tiene un solo submódulo (Adaptador) para administrar la dependencia.
Y si está codificando contra un Adaptador, si el Logger
inyectado en ese Adaptador o descubierto por el Adaptador generalmente es bastante insignificante para el objetivo general de mantenimiento. Y lo más importante, si tiene un adaptador de nivel de módulo, probablemente sea absurdo inyectarlo en cualquier cosa. Está escrito para el módulo.
tl; dr : deja de preocuparte por los principios sin tener en cuenta por qué los estás utilizando. Y, más prácticamente, solo construya un Adapter
para cada módulo. Use su criterio al decidir dónde dibuja los límites del "módulo". Desde cada módulo, siga adelante y consulte directamente el Adapter
. Y claro, inyecte el registrador real en el Adapter
, pero no en cada pequeña cosa que pueda necesitarlo.