8

Estoy tratando de usar Dependency Injection tanto como sea posible, pero estoy teniendo problemas cuando se trata de cosas como dependencias de corta duración.¿Las fábricas abstractas usan "nuevo"?

Por ejemplo, digamos que tengo un objeto de administrador de blog que desea generar una lista de blogs que encontró en la base de datos. Las opciones para hacer esto (por lo que puedo decir) son:

  1. nuevo Blog();
  2. $ this-> loader-> blog();
    • el objeto cargador crea varios otros tipos de objetos como objetos de base de filtros de texto, etc.
  3. $ this-> blogEntryFactory-> create();

Sin embargo, el # 1 es malo porque crea un fuerte acoplamiento. # 2 todavía parece malo porque significa que la fábrica de objetos debe inyectarse previamente, exponiendo todos los demás objetos que puede crear.

El número 3 parece correcto, pero si utilizo el # 3, ¿pongo las palabras clave "nuevas" en el blogEntryFactory en sí mismo, O, ¿Inyecto el cargador en el blogEntryFactory y uso el cargador?

Si tengo muchas fábricas diferentes como blogEntryFactory (por ejemplo, podría tener userFactory y commentFactory) parecería que poner la palabra clave "nueva" en todas estas fábricas diferentes crearía problemas de dependencia.

Espero que esto tenga sentido ...

NOTA

he tenido algunas respuestas acerca de cómo esto no es necesario para este ejemplo concreto blog, pero no son, de hecho, los casos en los que debería usa el patrón abstracto de fábrica, y ese es el punto en el que estoy llegando. ¿Usas "nuevo" en ese caso o haces otra cosa?

+0

Si no le expliqué esto de manera correcta o exhaustiva, hágamelo saber e intentaré aclarar – johnnietheblack

+0

Nunca he visto que se use la inyección de dependencia en las clases modelo. A menos que la clase 'Blog' encapsule cierta lógica comercial (lo que rara vez ocurre con los modelos), no tiene sentido tratar de reducir el acoplamiento a ella, no hay un comportamiento en el que se pueda emparejar. (Solo existe la estructura de la entidad, pero eso no va a cambiar.) – millimoose

+0

Primero, gracias por el comentario ... ¿entonces estás diciendo que el BlogManager debería/podría llamar "nuevo Blog()"? – johnnietheblack

Respuesta

4

No soy un experto, pero voy a analizar esto. Esto supone que Blog es solo un objeto de modelo de datos que actúa como contenedor de algunos datos y se llena con el controlador (new Blog no es muy significativo). En este caso, Blog es una hoja del gráfico de objetos, y usar new está bien. Si va a probar métodos que necesitan crear un Blog, tiene que probar simultáneamente la creación del Blog de todos modos, y usar un objeto simulado no tiene sentido ... el Blog no persiste más allá de este método.

Como ejemplo, supongamos que PHP no tiene una construcción de matriz pero tiene un objeto de colecciones. ¿Llamarías al $this->collectionsFactory->create() o estarías satisfecho de decir new Array;?

+0

Aclaración con la explicación de la hoja. – johnnietheblack

+1

Tandu, como acabo de agregar más arriba, aunque este escenario podría no merecer una fábrica, hay escenarios donde las fábricas son merecedoras. En esos casos, ¿usa "nuevo" en la fábrica o hace algo más? – johnnietheblack

Cuestiones relacionadas