Esto es más una nomenclatura (escritura técnica) que una pregunta puramente técnica. Estoy tratando de escribir una propuesta de refactorización (y asignarla a mí mismo) centrada en expandir la inyección de dependencia en nuestra aplicación. Si bien utilizamos Spring para autoabastecer beans, todavía hay instancias que crean instancias de beans MyClass obj = new MyClass(...)
que podrían inyectarse por completo. Me gustaría hacer que mi propuesta use una nomenclatura elegante y referirme al patrón de diseño opuesto a DI con un término apropiado.
¿Es "acoplamiento apretado" un término adecuado que se erige como un antónimo de DI?
Respuestas:
No. El acoplamiento apretado es mucho más de lo que trata la inyección de dependencia.
La inyección de dependencia externaliza una decisión de implementación. Esto va muy lejos para desacoplar, pero el acoplamiento es más que solo esto.
Un buen antónimo para la inyección de dependencias es codificar una dependencia . Cuando construyes (usa uno nuevo o usa directamente una fábrica) dentro de un objeto de comportamiento, has eliminado dos preocupaciones diferentes. Un localizador de servicios ayuda a desacoplar pero lo deja acoplado al localizador de servicios en sí.
El acoplamiento es más que solo separar la construcción y el comportamiento. Si tengo 101 métodos que deben llamarse en un orden particular de clase A a clase B, estoy estrechamente acoplado. No importa cuán maravillosamente separadas estén la construcción y el comportamiento.
El acoplamiento es una medida de la interdependencia de los dos objetos. Cualquier cosa que contribuya a dificultar hacer cambios en uno sin afectar al otro está contribuyendo al acoplamiento. La inyección de dependencia ayuda con esto, pero no es todo esto.
fuente
N
horas ... O hasta que se seleccione una respuesta. ¡Sé que no soy completamente objetivo cuando una respuesta ya tiene 10 votos y las otras 5 respuestas no tienen ninguno!Estrictamente hablando, la Inyección de dependencias solo se opone realmente a NO la Inyección de dependencias y, por lo tanto, a cualquier estrategia de administración de dependencias que no sea Inyección de dependencias.
El acoplamiento [no deseado], aunque no es exactamente un problema ortogonal, puede ocurrir o mitigarse de cualquier manera. Ambos están acoplados a
DependencyClass
:DependencyLookupConstructor
está acoplado a un particularDependencyClass
en este caso. Sin embargo, son ambos acoplados aDependencyClass
. El verdadero mal, si hay uno aquí, no es necesariamente el acoplamiento, es queDependencyLookupConstructor
debe cambiar si deDependencyClass
repente necesita inyectar sus propias dependencias 1 .Sin embargo, este constructor / clase está aún más débilmente acoplado:
Si está trabajando en C #, lo anterior permitan que el
ServiceLocator
regresar nada cuandoGetMyDoer()
se invoca, con tal de que tiene puededo()
lo queDependencyLocatingConstructor
lo tienedo()
. Obtiene el beneficio de la validación de firma en tiempo de compilación sin siquiera estar acoplado a una interfaz completa 2 .Entonces, elige tu veneno.
Pero, básicamente, si hay un "opuesto" concreto de la Inyección de dependencias, sería algo más en el ámbito de las "Estrategias de gestión de dependencias". Entre otros, si utilizó alguno de los siguientes en la conversación, lo reconocería como NO una inyección de dependencia:
1. Irónicamente, algunos de los problemas que DI resuelve en niveles más altos son el resultado de [sobre-] usar DI en los niveles más bajos. He tenido el placer de trabajar en bases de código con una complejidad innecesaria en todas partes como resultado de acomodar el puñado de lugares donde esa complejidad realmente ayudó ... Estoy ciertamente predispuesto por la mala exposición.
2. El uso de la ubicación del servicio también le permite especificar fácilmente diferentes dependencias del mismo tipo por su función funcional del código de invocación , mientras sigue siendo en gran medida agnóstico sobre cómo se construye la dependencia. Suponga que necesita resolver
User
oIUser
para diferentes propósitos: por ejemplo,Locator.GetAdministrator()
versusLocator.GetAuthor()
, o lo que sea. Mi código puede preguntar qué necesita funcionalmente sin siquiera saber qué interfaces admite.fuente
DependencyInjectedConstructor(DependencyClass dep)
es que DependencyClass podría ser una interfaz o una clase abstracta. Es por eso que me entristece que los codificadores de C # usen un prefijo de interfaz, como enIDependency
. Como cliente, realmente no es asunto mío lo que es esta cuestión de dependencia. Mientras no lo construya, todo lo que tengo que saber es cómo hablar con él. Lo que es es el problema de otra persona.DependencyClass
sea una interfaz abstracta en absoluto. Que sólo se requiere que la lógica de la construcción / configuración / ubicación existente "en otro lugar." ... Bueno, y más pertinente a la pregunta, el punto es que DI no es "lo opuesto al acoplamiento apretado" :)dynamic
parámetros. (Pero novar
parámetros, si la memoria sirve). Entonces, con DI en C #, creo que tengo que codificar contra una interfaz, o tengo que renunciar totalmente a la validación en tiempo de compilación.dynamic
ovar
y obtener un objeto de un localizador le permite ignorar la interfaz y usar cualquier clase que puedado()
lo que necesita, independientemente de si esa clase implementa algunaIDoer
interfaz. En otras palabras, si tenemos A-> B <-C, DI desacopla A de C, pero requiere que A y C estén acoplados a B, y evita el uso de D, incluso si D lo harádo()
.No sé si existe una terminología específica de la industria ampliamente aceptada, pero las alternativas que se me ocurren incluyen la creación de instancias internas , la creación de dependencias internas , las dependencias locales o las dependencias de ámbito local .
fuente
instance creation
pero no es lo suficientemente específico. DI crea instancias pero por medio del controlador y no a nivel de aplicación. tal vezinternal instance creation
Yo iría con la encapsulación de dependencia . Esto expresa que la dependencia está bloqueada en lugar de visitar y salir nuevamente.
fuente