¿Qué estrategia de dependencia se adapta a esta pequeña aplicación?

Tengo un pequeño PHP de línea de comandos aplicación que estoy creando para aprender algunos patrones de diseño comunes y técnicas OOP.

He configurado todas mis clases relevantes para que no creen instancias de objetos internamente, sino que reciben los objetos que necesitan a través de su constructor.

El problema ahora es cómo organizo todo para que cada objeto obtenga las dependencias que requiere. He leído sobre contenedores y marcos de inyección de dependencia, pero esto parece excesivo para una pequeña aplicación de línea de comandos. Me cuesta entender cómo encajarían en mi aplicación.

Actualmente el flujo es así:

  • El programa es ejecutado por el usuario en la línea de comando
  • Se produce Bootstrap, es decir, cargador automático, etc. instanciado, etc.
  • Tengo un método de fábrica que configura las dependencias (todas codificadas dentro de la clase) y devuelve un objeto de aplicación. Hay alrededor de 2 dependencias para la aplicación principal y cada una de ellas tiene otras 2 dependencias cada una (creo que esta es la parte difícil)
  • Se llama a la aplicación->ejecutar().

¿Cuál sería el mejor enfoque en términos de equilibrio entre flexibilidad y simplicidad, ya que no creo que el diseño (alrededor de la fábrica) sea del todo correcto?

preguntado el 24 de agosto de 12 a las 19:08

Tal vez puedas sacar algunas ideas de este enlace: fabien.potencier.org/article/50/… -

El enfoque de fábrica es correcto. Al final del día, algo tiene que hacer el trabajo de crear instancias de objetos y establecer las relaciones entre ellos. Lo que hace esto es la Fábrica. -

2 Respuestas

Por lo que parece, su aplicación está bastante bien organizada, la construcción está separada de la lógica de la aplicación y sus dependencias se administran claramente.

Por supuesto, podría agregar dependencias configurables o utilizar marcos de inyección de dependencia, sin embargo, recomendaría evitar ambos a menos que la aplicación lo requiera. Si comienza a usar un marco DI, asegúrese de mantener todo coherente aunque esté usando esta herramienta mágica e intente alejar todo del marco cuando sea posible (es decir, hacer que los módulos manejen las dependencias internas a través de fábricas en lugar de confiar en el marco). Divida la funcionalidad en módulos cuando tenga sentido.

Estoy trabajando en mejoras para una gran aplicación nebulosa que ejecuta todas sus dependencias a través de un marco DI y es lenta para iniciarse y se convierte en un poco de basura y no es agradable trabajar con ella, es una aplicación que hace "todo" en lugar de delegar tareas en módulos y bibliotecas y no tiene pruebas unitarias.

Lo principal a tener en cuenta es que hay muchas soluciones para cada problema y aprender diferentes patrones es una gran idea, hay muchos tipos de patrones de fábrica, apréndelos todos. Algunos son simples, algunos son más sofisticados, tendrá una idea de lo que funciona en diferentes situaciones.

Mi recomendación personal, si tu aplicación funciona como esperas, está organizada como parece, y si aún no lo has hecho (y el objetivo del juego es mejorar tus técnicas), practica:

  • Documentación (escriba algo de documentación y tírela a un amigo desarrollador para ver cómo lo manejan)
  • Pruebas (escriba algunas pruebas unitarias y luego reescriba la aplicación de una manera diferente)
  • Benchmarking (ejecute perfiles en su código e intente encontrar formas de optimizarlo)

Pruebe un enfoque diferente para la carga de fábrica, la fábrica dinámica, el patrón de construcción, el marco, use los puntos de referencia para comprender lo que negoció.

Respondido 29 ago 12, 15:08

Tu aplicación debería funcionar así:

$app = new Application($arg1, $arg2);
$app->run();

Todas las demás clases deben ser instanciadas en el Application, y se pasan como parámetros a los constructores de otras clases. La regla general es: cualquier constructor debe tener menos de 3 argumentos. Si sigues esta regla todo irá bien.

Respondido el 07 de Septiembre de 12 a las 13:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.