2009-06-04 23 views
41

He estado usando manual constructor injection DI por un tiempo. Una cosa que noto es que mis constructores están empezando a ser bastante largos.Inyección de constructor: ¿Cuántas dependencias hay demasiadas?

Tengo una clase que depende de un montón de pequeños objetos, en cualquier lugar entre 6 y 10 veces. A medida que sigo dividiendo mi solicitud en fragmentos más pequeños, podría ver que esta cantidad aumenta con el tiempo. ¿Es este un problema común?

Obviamente, esto dependerá en gran medida del proyecto. Sin embargo, la pregunta básica es la siguiente:

¿Cuándo comienza a sentirse incómodo con la cantidad de dependencias que tiene una clase? ¿Cuáles son algunas estrategias que usa para reducir estas dependencias?

Respuesta

10

Esto puede ser un signo de que la clase con las 6-10 dependencias necesita ser refactorizada.

+1

¿qué pasa si no puede encontrar la manera lógica de agruparlos en varias clases como WW. mencionado? ¿Estás de acuerdo en que está bien tener muchas dependencias? Quiero decir, digamos que las dependencias son marcas de automóviles: BMW, OPEL, VW, etc. Son todos autos. Tal vez no sea el mejor ejemplo, pero espero que entiendas la idea. –

+1

@ Darius.V - Si tiene una clase 'Cars' que tiene 50 dependencias de marca, entonces claramente ha violado el SRP. Necesita agruparlos en características comunes (es decir, 'ElectricCars',' HybridCars', 'DieselCars',' GasolineCars'), por lo que su clase 'Cars' de nivel superior solo tiene unas pocas dependencias que tienen propiedades y métodos comunes. Debajo de eso, puede usar el [patrón de estrategia] (https://stackoverflow.com/a/31971691) para simplificar varios autos similares en una sola dependencia (por ejemplo, solo tiene una sola 'GasolineCarsStrategy' que se inyecta en sus automóviles clase que maneja todos los autos de gasolina). – NightOwl888

4

Creo que no más de tres o cuatro. Si obtiene más que eso, comenzaría a pensar en qué tan bien está abstrayendo su concerns. Un solo objeto repository, por ejemplo, debe cumplir con todas sus necesidades de recuperación de datos dentro de la clase en cuestión.

+3

Presumiblemente, si un objeto requiere acceso a una base de datos y alguna forma de comunicarse externamente (por ejemplo, Repositorio e IO), eso ya es de 2 dependencias de las asignadas 4. Además, no es uno de los efectos secundarios de asegurarse de que cada la clase tiene una sola responsabilidad (preocupación única) que resultará en más clases en lugar de menos? En última instancia, es necesario que haya una clase que pueda orquestar todas estas piezas más pequeñas ... y esa clase tendrá muchas dependencias para funcionar. – Runcible

+0

@Runcible, bastante correcto. Y si la consolidación que describes tiene lugar, de hecho tendrás menos cosas para inyectar en el constructor. Lo que está describiendo BTW es un contenedor de inversión de control (como Windsor, por ejemplo). –

+1

@Runcible, he estado luchando con este tema de dependencia por inyección últimamente. Encontré dos publicaciones que me han sido útiles. http://blog.ploeh.dk/2010/01/20/RebuttalConstructorover-injectionanti-pattern/ & http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices/ Otra nota, creo que la intención de SRP no debe tener una clase que haga una cosa, pero tiene una razón para cambiar desde la perspectiva comercial. – GetFuzzy

0

Es posible que también desee ver si alguno de los parámetros de su constructor debe combinarse en una única clase (suponiendo que los parámetros tengan sentido como clase).

También podría ser que desee utilizar el patrón ServiceLocator para algunas de sus dependencias. Esto es particularmente cierto si tiene que pasar las dependencias por una larga cadena de constructores.

+4

El patrón de Localizador de servicios es una especie de oposición a los principios de Inyección de dependencias. Service Locator viola la Ley de Demeter: http://www.youtube.com/watch?v=RlfLCWKxHJ0 – Runcible

+0

Muy buen video, Runcible. Explicación muy comprensible de DI, IOC, Service Locator. – Alexanderius

9

No me preocuparía.

En cambio, me preocuparía que la clase sea demasiado compleja.

Una clase con muchas dependencias que las usa todas pero que no tiene bucles o que las declaraciones son correctas. En algún código en el que estuve trabajando recientemente, había alrededor de 14 dependencias en una clase. Sin embargo, solo había una ruta a través del código y ninguna forma lógica de agrupar las dependencias en mejores clases.

Se debe simplificar una clase con un número pequeño de dependencias que contenga muchas instrucciones de bifurcación o condiciones complejas de bucle.

1

Una clase con 6-10 dependencias es un olor a código. Es una clara indicación de que la clase está violando el Single Responsibility Principle.

¿Cuáles son algunas estrategias que utiliza para reducir estas dependencias?

Marcos Seemann ha hecho esa tarea clara en su puesto Refactoring to Aggregate Services y Moreso en su libro Dependency Injection in .NET. El hecho de que tu clase tenga tantas dependencias indica que hay más de una responsabilidad dentro de la clase. A menudo existe un concepto de dominio implícito esperando a ser explícito identificándolo y convirtiéndolo en su propio servicio. En términos generales, la mayoría de las clases nunca deberían necesitar más de 4-5 dependencias.

Cuestiones relacionadas