Два компонента, предлагающие одинаковую функциональность, требуемую разными зависимостями


9

Я создаю приложение на PHP, используя Zend Framework 1 и Doctrine2 в качестве слоя ORM. Все идет хорошо. Теперь я заметил, что и ZF1, и Doctrine2 поставляются с собственной реализацией кэширования и полагаются на нее. Я оценил и то и другое, и хотя у каждого есть свои плюсы и минусы, ни один из них не превосходит другого для моих простых потребностей. Кажется, что обе библиотеки написаны для их соответствующих интерфейсов, а не для их реализаций.

Причины, по которым я чувствую эту проблему, заключаются в том, что во время начальной загрузки моего приложения мне приходится настраивать два драйвера кэширования - каждый со своим собственным синтаксисом. Таким образом легко возникает несоответствие, и из-за этого кажется неэффективным устанавливать два подключения к бэкэнду кэширования.

Я пытаюсь определить, каков наилучший способ продвижения вперед, и приветствую любые идеи, которые вы можете предложить.

До сих пор я придумал четыре варианта:

  1. Ничего не предпринимайте, примите, что присутствуют два класса, предлагающие функциональность кэширования.
  2. Создайте класс Facade, чтобы прикрепить интерфейс Zend к реализации кэширования Doctrine.
  3. Вариант 2, наоборот - создать Facade для сопоставления интерфейса Doctrine на сервере Zend Framework.
  4. Используйте множественное интерфейсное наследование, чтобы создать один интерфейс, чтобы управлять ими всеми, и молитесь, чтобы не было никаких совпадений (то есть: если у обоих есть метод "save", им нужно будет принимать параметры в том же порядке из-за PHP отсутствие правильного полиморфизма).

Какой вариант лучше, или есть вариант «Ни один из вышеперечисленных», о котором я не знаю?


3
Возможно, вам следует описать проблему в более общем смысле для разработки программного обеспечения, для людей, которые не знают PHP, ZF или Doctrine. Две библиотеки кешируют одно и то же? Если так, то почему бы не отключить один кеш? Если нет, то в чем проблема? Что-то в этом роде.
idoby

Ранее я работал с .NET CMS, у которой был собственный ORM и поставщик кэша доступа к базе данных. Затем мне пришлось интегрировать CMS с нашей бизнес-платформой, в которой использовался совершенно другой поставщик кэширования. Это вызвало у нас проблему, поскольку поставщик кэша в CMS не масштабировался до веб-фермы, когда наш поставщик кэша бизнес-платформы мог масштабироваться. С какими проблемами вы сталкиваетесь?
CodeART

Взгляните на Symfony2 и как они решили эту проблему.
nietonfir

Ответы:


7

Ничего не делать Примите, что отдельные проекты могут иметь избыточность, если они работают в своих собственных пространствах (не загрязняя друг друга кешами). Доктрина знает, что у Зенда есть кеширование, но они не хотят зависеть от Зенда и наоборот. Не все люди хотят использовать Zend и Doctrine.

Я бы позволил коду Doctrine использовать свои собственные вещи и использовать ZF для всего остального. Таким образом, мне нужно знать только классы ZF. Кэш доктрины должен использоваться доктриной только для объекта базы данных. ZF имеет больше внешнего интерфейса, который полезен вне ORM, например, внешний интерфейс для кэширования HTML-страниц.

Создание другого слоя было бы идеальным, но это добавит еще одну зависимость к проекту, поэтому не очень хорошо для обслуживания.

Я знаю, что в начальной загрузке это может выглядеть избыточно для настройки нескольких кэшей. Это может ухудшиться, если вы попытаетесь использовать ZF1, Doctrine и ZF2 одновременно. Но это очень маленькое постоянное время, так как они только устанавливают переменные, еще не подключаясь к бэк-эндам.

Итак, с точки зрения программирования, обслуживания и эксплуатации, я бы просто оставил их в покое.


3

Причины, по которым я чувствую эту проблему, заключаются в том, что во время начальной загрузки моего приложения мне приходится настраивать два драйвера кэширования - каждый со своим собственным синтаксисом. Таким образом легко возникает несоответствие , и из-за этого кажется неэффективным устанавливать два подключения к бэкэнду кэширования.

Почему бы просто не решить проблему с точки зрения «сделать конфигурацию более удобной»?

Другими словами, напишите некоторый новый класс, который принимает ваши данные конфигурации, а затем применяет их к обоим драйверам кэширования. Конечно, это не так гибко, но это также означает, что меньше может пойти не так.


0

Почему бы не создать абстракцию вашего интерфейса, которая может быть специализирована для каждой из фреймворков? Я написал бы свой собственный контроллер кэширования с необходимыми мне методами, которые инкапсулировали бы оба кэша. Тогда я могу забыть о них и поговорить только с моим контроллером. Есть проблемы с этим решением?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.