Due componenti che offrono la stessa funzionalità, richiesta da diverse dipendenze

9

Sto costruendo un'applicazione in PHP, usando Zend Framework 1 e Doctrine2 come layer ORM. Tutto sta andando bene. Ora, mi è capitato di notare che sia ZF1 che Doctrine2 arrivano e fanno affidamento sulla loro implementazione di memorizzazione nella cache. Ho valutato entrambi, e mentre ognuno ha i propri pro e contro, nessuno dei due si distingue come superiore all'altro per le mie esigenze semplici. Entrambe le librerie sembrano essere scritte contro le loro rispettive interfacce, non con le loro implementazioni.

I motivi per i quali ritengo che questo sia un problema è che durante il bootstrap della mia applicazione, devo configurare due driver di memorizzazione nella cache, ognuno con la propria sintassi. Una mancata corrispondenza viene facilmente creata in questo modo e, a causa di ciò, risulta inefficiente impostare due connessioni al back-end di memorizzazione nella cache.

Sto provando a determinare quale sia la migliore strada da seguire, e accolgo con favore eventuali approfondimenti che potresti essere in grado di offrire.

Ciò che ho pensato finora sono quattro opzioni:

  1. Non fare nulla, accetta che siano presenti due classi che offrono funzionalità di memorizzazione nella cache.
  2. Crea una classe di facciata per attaccare l'interfaccia di Zend all'implementazione della cache di Doctrine.
  3. Opzione 2, viceversa - crea una facciata per mappare l'interfaccia di Doctrine su un backend Zend Framework.
  4. Utilizza l'ereditarietà dell'interfaccia multipla per creare un'interfaccia per domarli tutti e pregare che non vi siano sovrapposizioni (ovvero: se entrambi hanno un metodo "salva", dovranno accettare parametri nello stesso ordine a causa della mancanza di un adeguato polimorfismo di PHP).

Quale opzione è la migliore, o c'è una variante "Nessuna delle precedenti" di cui non sono a conoscenza?

    
posta kander 02.08.2013 - 16:04
fonte

3 risposte

7

Non fare nulla accetta che i progetti separati possano avere ridondanza purché funzionino nei loro spazi (non inquinando le altre cache). Doctrine sa che Zend ha il caching ma non vogliono essere dipendenti da Zend e viceversa. Non tutte le persone vogliono usare Zend e Doctrine.

Vorrei che il codice Doctrine usasse le sue stesse cose e usasse ZF per tutto il resto. In questo modo ho solo bisogno di conoscere le classi ZF. La cache di Doctrine dovrebbe essere utilizzata solo internamente da doctrine per l'oggetto database. ZF ha più front-end che è utile al di fuori di un ORM, come il front-end della cache della pagina html.

Creare un altro livello sarebbe l'ideale, ma aggiungerà un'altra dipendenza al progetto, quindi non molto utile per la manutenzione.

So che in bootstrap può sembrare ridondante per configurare più cache. Può peggiorare se si tenta di utilizzare contemporaneamente ZF1, Doctrine e ZF2. Ma è un tempo costante molto piccolo in quanto configurano solo variabili, non ancora collegate alle estremità posteriori.

Quindi, dal punto di vista della programmazione, della manutenzione e dell'operazione, li lascerei da soli.

    
risposta data 30.08.2013 - 03:49
fonte
3

Reasons why I feel this is an issue is that during the bootstrapping of my application, I have to configure two caching drivers - each with its own syntax. A mismatch is easily created this way, and it feels inefficient to set up two connections to the caching backend because of this.

Perché non affrontare il problema solo da un punto di vista di "rendere la configurazione più conveniente"?

In altre parole, scrivi una nuova classe che accetti i tuoi dati di configurazione e quindi la applica a entrambi i driver di cache. Certo, non è così flessibile, ma significa anche che meno può andare male.

    
risposta data 30.08.2013 - 18:31
fonte
0

Perché non creare un'astrazione dell'interfaccia che può essere specializzata in ciascuno dei framework? Scriverò il mio controller di cacheing con i metodi che mi servono, che incapsulerebbero entrambe le cache. Quindi posso dimenticarli e parlare solo con il mio Controller. Qualche problema con quella soluzione?

    
risposta data 31.08.2013 - 08:57
fonte

Leggi altre domande sui tag