Dos componentes que ofrecen la misma funcionalidad, requerida por diferentes dependencias

9

Estoy creando una aplicación en PHP, usando Zend Framework 1 y Doctrine2 como la capa ORM. Todo va bien Ahora, me di cuenta de que tanto ZF1 como Doctrine2 vienen con su propia implementación de almacenamiento en caché y dependen de ella. He evaluado ambos, y aunque cada uno tiene sus propios pros y contras, ninguno de ellos se destaca como superior al otro por mis simples necesidades. Ambas bibliotecas también parecen estar escritas en sus respectivas interfaces, no en sus implementaciones.

Las razones por las que siento que esto es un problema es que durante el arranque de mi aplicación, tengo que configurar dos controladores de almacenamiento en caché, cada uno con su propia sintaxis. Un desajuste se crea fácilmente de esta manera, y se siente ineficiente configurar dos conexiones al backend de almacenamiento en caché debido a esto.

Estoy tratando de determinar cuál es el mejor camino a seguir, y agradecería cualquier idea que pueda ofrecer.

Lo que he pensado hasta ahora son cuatro opciones:

  1. No haga nada, acepte que hay dos clases que ofrecen funcionalidad de almacenamiento en caché.
  2. Cree una clase de Fachada para pegar la interfaz de Zend en la implementación de almacenamiento en caché de Doctrine.
  3. Opción 2, al revés: cree una Fachada para mapear la interfaz de Doctrine en un backend de Zend Framework.
  4. Use la herencia de múltiples interfaces para crear una interfaz para gobernarlos a todos, y ore para que no haya superposiciones (es decir: si ambos tienen un método "guardar", deberán aceptar los parámetros en el mismo orden debido a PHP falta de polimorfismo adecuado).

¿Qué opción es mejor, o hay una variante de "Ninguna de las anteriores" que no conozco?

kander
fuente
3
Quizás debería describir el problema en un sentido más general de diseño de software, para personas que no conocen PHP, ZF o Doctrine. ¿Las dos bibliotecas almacenan en caché lo mismo? Si es así, ¿por qué no deshabilitar un caché? Si no, ¿cuál es el problema? Esa clase de cosas.
idoby
Anteriormente he trabajado con un .NET CMS que tenía su propio proveedor de caché de acceso a base de datos y ORM. Luego tuve que integrar CMS con nuestra plataforma de negocios, que ha utilizado un proveedor de almacenamiento en caché completamente diferente. Esto nos ha causado un problema, ya que el proveedor de caché dentro de CMS no era escalable a una granja de servidores web, cuando nuestro proveedor de caché de plataforma comercial podía escalar. ¿Qué problemas estás enfrentando?
CodeART
Eche un vistazo a Symfony2 y cómo abordaron este problema.
nietonfir

Respuestas:

7

No haga nada. Acepte que los proyectos separados pueden tener redundancia siempre que trabajen en sus propios espacios (sin contaminar entre sí los cachés). Doctrine sabe que Zend tiene almacenamiento en caché, pero no quieren depender de Zend y viceversa. No todas las personas quieren usar Zend y Doctrine.

Dejaría que el código de Doctrine use sus propias cosas y use ZF para todo lo demás. De esta manera solo necesito saber las clases de ZF. Doctrine cache solo debe usarse internamente por doctrina para objeto de base de datos. ZF tiene más front-end que es útil fuera de un ORM, como el front-end de almacenamiento en caché de páginas html.

Crear otra capa sería ideal, pero agregará otra dependencia al proyecto, por lo que no es muy bueno para el mantenimiento.

Sé que en bootstrap puede parecer redundante configurar múltiples cachés. Puede empeorar si intenta usar ZF1, Doctrine y ZF2 simultáneamente. Pero es un tiempo constante muy pequeño, ya que solo configuran variables, aún no se conectan a los extremos.

Entonces, desde la perspectiva de programación, mantenimiento y operación, simplemente los dejaría en paz.

imel96
fuente
3

Las razones por las que siento que esto es un problema es que durante el arranque de mi aplicación, tengo que configurar dos controladores de almacenamiento en caché, cada uno con su propia sintaxis. Un desajuste se crea fácilmente de esta manera , y se siente ineficiente configurar dos conexiones al backend de almacenamiento en caché debido a esto.

¿Por qué no simplemente abordar el problema desde el punto de vista de "hacer que la configuración sea más conveniente"?

En otras palabras, escriba alguna clase nueva que acepte sus datos de configuración y luego los aplique a ambos controladores de almacenamiento en caché. Claro, no es tan flexible, pero eso también significa que menos puede salir mal.

Darien
fuente
0

¿Por qué no crear una abstracción de su interfaz que pueda especializarse para cada uno de los marcos? Escribiría mi propio controlador de almacenamiento en caché con los métodos que necesito, que encapsularían ambas memorias caché. Entonces puedo olvidarme de ellos y solo hablar con mi controlador. ¿Algún problema con esa solución?

Dmitri Zaitsev
fuente