Dois componentes que oferecem a mesma funcionalidade, exigida por diferentes dependências

9

Estou construindo um aplicativo em PHP, usando o Zend Framework 1 e o Doctrine2 como a camada ORM. Tudo está indo bem. Agora, notei que o ZF1 e o Doctrine2 vêm com, e contam com, sua própria implementação de cache. Avaliei os dois e, embora cada um tenha seus próprios prós e contras, nenhum deles se destaca como superior ao outro por minhas simples necessidades. As duas bibliotecas também parecem escritas em suas respectivas interfaces, não em suas implementações.

O motivo pelo qual sinto que isso é um problema é que, durante a inicialização do meu aplicativo, tenho que configurar dois drivers de cache - cada um com sua própria sintaxe. Uma incompatibilidade é facilmente criada dessa maneira e parece ineficiente configurar duas conexões com o back-end de armazenamento em cache por causa disso.

Estou tentando determinar qual é o melhor caminho a seguir e gostaria de receber informações que você possa oferecer.

O que eu pensei até agora são quatro opções:

  1. Não faça nada, aceite que duas classes que oferecem funcionalidade de cache estão presentes.
  2. Crie uma classe Facade para colar a interface do Zend na implementação de cache do Doctrine.
  3. Opção 2, ao contrário - crie uma Fachada para mapear a interface do Doctrine em um back-end do Zend Framework.
  4. Use herança de interface múltipla para criar uma interface para governar todas elas e ore para que não haja sobreposições (ou seja: se ambos tiverem um método "save", eles precisarão aceitar parâmetros na mesma ordem devido aos PHP) falta de polimorfismo adequado).

Qual é a melhor opção ou existe uma variante "Nenhuma das opções acima" que eu não conheço?

Kander
fonte
3
Talvez você deva descrever o problema em um sentido mais geral de design de software, para pessoas que não conhecem PHP, ZF ou Doctrine. As duas bibliotecas estão armazenando em cache a mesma coisa? Se sim, por que não desativar um cache? Se não, qual é o problema? Esse tipo de coisas.
Idgy
Eu já trabalhei com um .NET CMS que tinha seu próprio provedor de cache de acesso ao banco de dados e ORM. Eu tive que integrar o CMS à nossa plataforma de negócios, que usou um provedor de cache completamente diferente. Isso nos causou um problema, já que o provedor de cache no CMS não era escalável para um web farm, quando nosso provedor de cache da plataforma de negócios podia ser expandido. Que problemas você está enfrentando?
CodeART 29/08
Dê uma olhada no Symfony2 e como eles resolveram esse problema.
Nietonfir 30/08/2013

Respostas:

7

Não faça nada Aceite que projetos separados possam ter redundância desde que funcionem em seus próprios espaços (sem poluir os caches uns dos outros). A doutrina sabe que o Zend tem cache, mas eles não querem depender do Zend e vice-versa. Nem todas as pessoas querem usar o Zend e o Doctrine.

Eu deixaria o código Doctrine usar seu próprio material e usar o ZF para todo o resto. Dessa forma, eu só preciso conhecer as classes ZF. O cache da doutrina deve ser usado apenas internamente pela doutrina do objeto de banco de dados. O ZF possui mais front-end útil fora de um ORM, como front-end de cache de páginas html.

Criar outra camada seria o ideal, mas adicionará outra dependência ao projeto, portanto, não é muito bom para manutenção.

Eu sei que no bootstrap pode parecer redundante para configurar vários caches. Pode piorar se você tentar usar o ZF1, Doctrine e ZF2 simultaneamente. Mas é um tempo constante muito pequeno, pois eles apenas configuram variáveis, ainda não conectadas aos back-ends.

Então, do ponto de vista de programação, manutenção e operação, eu os deixaria em paz.

imel96
fonte
3

O motivo pelo qual sinto que isso é um problema é que, durante a inicialização do meu aplicativo, tenho que configurar dois drivers de cache - cada um com sua própria sintaxe. Uma incompatibilidade é facilmente criada dessa maneira e parece ineficiente configurar duas conexões com o back-end de armazenamento em cache por causa disso.

Por que não resolver o problema do ponto de vista de "tornar a configuração mais conveniente"?

Em outras palavras, escreva uma nova classe que aceite seus dados de configuração e os aplique aos dois drivers de armazenamento em cache. Claro, não é tão flexível, mas isso também significa que menos pode dar errado.

Darien
fonte
0

Por que não criar uma abstração da sua interface que possa ser especializada em cada uma das estruturas? Eu escreveria meu próprio controlador de cache com os métodos necessários, que encapsulariam os dois caches. Então eu posso esquecê-los e só falar com meu controlador. Algum problema com essa solução?

Dmitri Zaitsev
fonte