Deux composants offrant la même fonctionnalité, requis par différentes dépendances

9

Je construis une application en PHP, en utilisant Zend Framework 1 et Doctrine2 comme couche ORM. Tout va bien. Maintenant, j'ai remarqué que ZF1 et Doctrine2 sont livrés avec leur propre implémentation de mise en cache et s'appuient sur eux. J'ai évalué les deux, et bien que chacun ait ses propres avantages et inconvénients, aucun d'eux ne se distingue comme supérieur à l'autre pour mes besoins simples. Les deux bibliothèques semblent également être écrites sur leurs interfaces respectives, et non sur leurs implémentations.

Les raisons pour lesquelles je pense que c'est un problème sont que pendant le démarrage de mon application, je dois configurer deux pilotes de mise en cache - chacun avec sa propre syntaxe. Une incompatibilité est facilement créée de cette façon et il semble inefficace de configurer deux connexions au backend de mise en cache à cause de cela.

J'essaie de déterminer quelle est la meilleure voie à suivre et j'accueillerais volontiers toutes les informations que vous pourriez offrir.

Jusqu'à présent, j'ai pensé à quatre options:

  1. Ne faites rien, acceptez que deux classes offrant des fonctionnalités de mise en cache soient présentes.
  2. Créez une classe Facade pour coller l'interface de Zend sur l'implémentation de la mise en cache de Doctrine.
  3. Option 2, l'inverse - créez une façade pour mapper l'interface de Doctrine sur un backend Zend Framework.
  4. Utilisez l'héritage d'interfaces multiples pour créer une interface pour les gouverner tous, et priez pour qu'il n'y ait pas de chevauchements (c'est-à-dire: si les deux ont une méthode "save", ils devront accepter les paramètres dans le même ordre en raison de PHP) manque de polymorphisme approprié).

Quelle option est la meilleure ou existe-t-il une variante "Aucune des réponses ci-dessus" que je ne connais pas?

kander
la source
3
Peut-être devriez-vous décrire le problème dans un sens plus général de conception de logiciels, pour les personnes qui ne connaissent pas PHP, ZF ou Doctrine. Les deux bibliothèques mettent-elles en cache la même chose? Si oui, pourquoi ne pas désactiver un cache? Sinon, quel est le problème? Ce genre de chose.
idobie
J'ai déjà travaillé avec un CMS .NET qui avait son propre ORM et fournisseur de cache d'accès à la base de données. J'ai ensuite dû intégrer CMS à notre plate-forme commerciale, qui a utilisé un fournisseur de mise en cache complètement différent. Cela nous a posé un problème car le fournisseur de cache dans le CMS n'était pas extensible à une batterie de serveurs Web, alors que notre fournisseur de cache de plateforme commerciale pouvait évoluer. Quels problèmes rencontrez-vous cependant?
CodeART
Jetez un œil à Symfony2 et à la façon dont ils ont résolu ce problème.
nietonfir

Réponses:

7

Ne rien faire Acceptez que des projets séparés puissent avoir une redondance tant qu'ils fonctionnent dans leurs propres espaces (sans se polluer mutuellement les caches). La doctrine sait que Zend a un cache, mais ils ne veulent pas dépendre de Zend et vice versa. Tout le monde ne veut pas utiliser Zend et Doctrine.

Je laisserais le code Doctrine utiliser ses propres trucs et utiliser ZF pour tout le reste. De cette façon, je n'ai besoin que de connaître les classes ZF. Le cache de doctrine ne doit être utilisé qu'en interne par la doctrine pour l'objet de base de données. ZF a plus de front-end utile en dehors d'un ORM, comme le front-end de mise en cache de page html.

La création d'une autre couche serait idéale mais cela ajoutera une autre dépendance au projet, donc pas très bon pour la maintenance.

Je sais que dans le bootstrap, il peut sembler redondant de configurer plusieurs caches. Cela peut empirer si vous essayez d'utiliser simultanément ZF1, Doctrine et ZF2. Mais c'est un temps constant très petit car ils ne configurent que des variables, ne se connectant pas encore aux back-ends.

Donc, du point de vue de la programmation, de la maintenance et du fonctionnement, je les laisserais tranquilles.

imel96
la source
3

Les raisons pour lesquelles je pense que c'est un problème sont que pendant le démarrage de mon application, je dois configurer deux pilotes de mise en cache - chacun avec sa propre syntaxe. Une incompatibilité est facilement créée de cette façon , et il semble inefficace de configurer deux connexions au backend de mise en cache à cause de cela.

Pourquoi ne pas simplement aborder le problème d'un point de vue «rendre la configuration plus pratique»?

En d'autres termes, écrivez une nouvelle classe qui accepte vos données de configuration, puis appliquez-la aux deux pilotes de mise en cache. Bien sûr, ce n'est pas aussi flexible, mais cela signifie également que moins de choses peuvent mal tourner.

Darien
la source
0

Pourquoi ne pas créer une abstraction de votre interface pouvant être spécialisée dans chacun des frameworks? J'écrirais mon propre contrôleur de cache avec les méthodes dont j'ai besoin, qui encapsuleraient les deux caches. Ensuite, je peux les oublier et ne parler qu'à mon contrôleur. Des problèmes avec cette solution?

Dmitri Zaitsev
la source