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


9

Sto creando un'applicazione in PHP, usando Zend Framework 1 e Doctrine2 come livello ORM. Tutto sta andando bene. Ora, mi è capitato di notare che sia ZF1 che Doctrine2 sono dotati e fanno affidamento sulla propria implementazione della memorizzazione nella cache. Ho valutato entrambi, e mentre ognuno ha i suoi pro e contro, nessuno dei due si distingue come l'altro per i miei semplici bisogni. Entrambe le librerie sembrano anche essere scritte contro le loro rispettive interfacce, non le loro implementazioni.

I motivi per cui 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 inefficace impostare due connessioni al backend della cache.

Sto cercando di determinare quale sia la strada migliore da seguire e sarei lieto di ricevere qualsiasi informazione che potresti essere in grado di offrire.

Quello 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 Facade per incollare l'interfaccia di Zend sull'implementazione della cache di Doctrine.
  3. Opzione 2, viceversa: crea una facciata per mappare l'interfaccia di Doctrine su un backend di Zend Framework.
  4. Usa l'ereditarietà multi-interfaccia per creare un'interfaccia per governarli tutti e prega che non ci siano sovrapposizioni (es .: se entrambi hanno un metodo "salva", dovranno accettare i parametri nello stesso ordine a causa dei PHP mancanza di un adeguato polimorfismo).

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


3
Forse dovresti descrivere il problema in un senso più generale di progettazione del software, per le persone che non conoscono PHP, ZF o Doctrine. Le due librerie memorizzano nella cache la stessa cosa? In tal caso, perché non disabilitare una cache? In caso contrario, qual è il problema? Questo genere di cose.
idoby,

In precedenza ho lavorato con un .NET CMS che aveva il proprio ORM e provider di cache di accesso al database. Ho quindi dovuto integrare CMS con la nostra piattaforma di business, che ha utilizzato provider di cache completamente diversi. Questo ci ha causato un problema in quanto il provider di cache all'interno di CMS non era scalabile in una Web farm, quando il nostro provider di cache della piattaforma aziendale poteva ridimensionarsi. Quali problemi stai affrontando però?
CodeART

Dai un'occhiata a Symfony2 e al modo in cui hanno affrontato questo problema.
nietonfir,

Risposte:


7

Non accettare che i progetti separati possano avere ridondanza purché funzionino nei propri spazi (non inquinando le altre cache). La dottrina sa che Zend ha la memorizzazione nella cache ma non vuole dipendere da Zend e viceversa. Non tutte le persone vogliono usare Zend e Doctrine.

Lascerei che il codice Doctrine utilizzi le sue cose e usi ZF per tutto il resto. In questo modo ho solo bisogno di conoscere le classi ZF. La cache della dottrina deve essere utilizzata solo internamente dalla dottrina per l'oggetto del database. ZF ha più front-end utili al di fuori di un ORM, come il front-end di memorizzazione nella cache della pagina HTML.

La creazione di un altro livello sarebbe l'ideale ma aggiungerà un'altra dipendenza al progetto, quindi non molto buona per la manutenzione.

So che nel bootstrap può sembrare ridondante impostare più cache. Può peggiorare se si tenta di utilizzare ZF1, Doctrine e ZF2 contemporaneamente. Ma è un tempo costante molto piccolo in quanto impostano solo variabili, non connettendosi ancora ai back-end.

Quindi, dal punto di vista della programmazione, della manutenzione e del funzionamento, li lascerei in pace.


3

I motivi per cui 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 inefficace impostare due connessioni al backend della cache.

Perché non affrontare semplicemente il problema dal punto di vista "rendere la configurazione più conveniente"?

In altre parole, scrivere una nuova classe che accetta i dati di configurazione e quindi li applica a entrambi i driver di memorizzazione nella cache. Certo, non è così flessibile, ma ciò significa anche che meno può andare storto.


0

Perché non creare un'astrazione della tua interfaccia che può essere specializzata in ciascuno dei framework? Scriverei il mio controller di cache con i metodi di cui ho bisogno, che incapsulerebbero entrambe le cache. Quindi posso dimenticarmene e parlare solo con il mio controller. Qualche problema con quella soluzione?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.