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


9

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

Причини, чому я вважаю це проблемою, полягає в тому, що під час завантаження програми я повинен налаштувати два драйвери кешування - у кожного зі своїм синтаксисом. Невідповідність легко створюється таким чином, і він вважає неефективним встановити два з’єднання з кешбеком через це.

Я намагаюся визначити, який найкращий шлях вперед, і вітаю будь-яку інформацію, яку ви можете запропонувати.

Що я придумав до цього, це чотири варіанти:

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

Який варіант найкращий, чи є варіант «Нічого з перерахованого вище», про який я не знаю?


3
Можливо, ви повинні описати проблему в більш загальному сенсі дизайнерського програмного забезпечення для людей, які не знають PHP, ZF чи Doctrine. Дві бібліотеки кешують одне і те ж? Якщо так, то чому б не відключити один кеш? Якщо ні, у чому проблема? Така річ.
ідобі

Раніше я працював з .NET CMS, який мав власного оператора керування доступом до ORM та бази даних. Тоді мені довелося інтегрувати CMS з нашою бізнес-платформою, яка використовувала зовсім інший провайдер кешування. Це спричинило нам проблему, оскільки постачальник кеш-пам'яті в CMS не піддавався масштабуванню до веб-ферми, коли наш провайдер кеш-пам'яті бізнес-платформи міг розширити масштаб. З якими проблемами ви стикаєтесь?
CodeART

Погляньте на Symfony2 та те, як вони вирішили цю проблему.
nietonfir

Відповіді:


7

Не робіть нічого. Прийміть, що окремі проекти можуть мати надмірність, якщо вони працюють у власних просторах (не забруднюючи кеші один одного). Доктрина знає, що у Зенда є кешування, але вони не хочуть бути залежними від Зенда і навпаки. Не всі люди хочуть використовувати Зенд і Доктрину.

Я б дозволив коду доктрини використовувати власні речі та використовувати ZF для всього іншого. Таким чином мені потрібно знати лише класи ЗФ. Кеш доктрин повинен використовуватися лише внутрішньо доктриною для об'єкта бази даних. ZF має більше переднього кінця, який корисний поза ORM, як-от html-сторінка кешування переднього кінця.

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

Я знаю, що в завантажувальному інструменті це може виглядати зайвим для налаштування декількох кешів. Це може погіршитися, якщо спробувати використовувати ZF1, Doctrine і ZF2 одночасно. Але це дуже малий постійний час, оскільки вони встановлюють лише змінні, ще не підключаючись до останніх кінців.

Тож, з точки зору програмування, обслуговування та експлуатації, я б просто їх залишив у спокої.


3

Причини, чому я вважаю це проблемою, полягає в тому, що під час завантаження програми я повинен налаштувати два драйвери кешування - у кожного зі своїм синтаксисом. Невідповідність легко створюється таким чином , і він вважає неефективним встановити два з’єднання з кешбеком через це.

Чому б не просто вирішити цю проблему з точки зору "зробити конфігурацію зручнішою"?

Іншими словами, напишіть новий клас, який приймає ваші дані конфігурації, а потім застосуйте їх до обох драйверів кешування. Звичайно, це не так гнучко, але це також означає, що менше може піти не так.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.