Dwa komponenty oferujące tę samą funkcjonalność, wymagane przez różne zależności

9

Buduję aplikację w PHP, używając Zend Framework 1 i Doctrine2 jako warstwy ORM. Wszystko idzie dobrze. Teraz zauważyłem, że zarówno ZF1, jak i Doctrine2 mają własną implementację buforowania i polegają na niej. Oceniłem oba, i chociaż każdy ma swoje zalety i wady, żaden z nich nie wyróżnia się na tle innych pod względem moich prostych potrzeb. Obie biblioteki również wydają się być napisane przeciwko ich odpowiednim interfejsom, a nie ich implementacjom.

Powodem, dla którego uważam, że jest to problem, jest to, że podczas ładowania aplikacji muszę skonfigurować dwa sterowniki buforowania - każdy z własną składnią. W ten sposób można łatwo utworzyć niedopasowanie i dlatego nie jest możliwe skonfigurowanie dwóch połączeń z zapleczem buforowania.

Staram się ustalić, co jest najlepszym rozwiązaniem, i chętnie przyjmę wszelkie spostrzeżenia, które możesz zaoferować.

Do tej pory wymyśliłem cztery opcje:

  1. Nie rób nic, zaakceptuj obecność dwóch klas oferujących funkcje buforowania.
  2. Utwórz klasę Fasada, aby przykleić interfejs Zend do implementacji buforowania Doctrine.
  3. Opcja 2, odwrotnie - utwórz fasadę, aby zmapować interfejs Doctrine na backendie Zend Framework.
  4. Użyj dziedziczenia wielu interfejsów, aby utworzyć jeden interfejs, aby rządzić nimi wszystkimi, i módl się, aby nie nakładały się na siebie (tj. Jeśli oba mają metodę „zapisz”, będą musiały akceptować parametry w tej samej kolejności ze względu na PHP brak właściwego polimorfizmu).

Która opcja jest najlepsza lub czy istnieje wariant „Żaden z powyższych”, o którym nie wiem?

Kander
źródło
3
Być może powinieneś opisać problem w bardziej ogólnym sensie projektowania oprogramowania dla osób, które nie znają PHP, ZF lub Doctrine. Czy dwie biblioteki buforują to samo? Jeśli tak, to dlaczego nie wyłączyć jednej pamięci podręcznej? Jeśli nie, w czym problem? Coś w tym rodzaju.
idoby
Wcześniej współpracowałem z .NET CMS, który miał własnego dostawcę pamięci podręcznej ORM i bazy danych. Następnie musiałem zintegrować CMS z naszą platformą biznesową, która korzystała z zupełnie innego dostawcy buforowania. To spowodowało nam problem, ponieważ dostawca pamięci podręcznej w systemie CMS nie był skalowalny do farmy internetowej, gdy nasz dostawca pamięci podręcznej platformy biznesowej mógł się skalować. Jakie masz jednak problemy?
CodeART
Spójrz na Symfony2 i jak poradzili sobie z tym problemem.
nietonfir

Odpowiedzi:

7

Nie rób nic Zaakceptuj, że oddzielne projekty mogą mieć nadmiarowość, o ile działają we własnych przestrzeniach (nie zanieczyszczając się wzajemnie pamięciami podręcznymi). Doctrine wie, że Zend ma buforowanie, ale nie chcą być zależni od Zend i odwrotnie. Nie wszyscy ludzie chcą korzystać z Zend i Doctrine.

Pozwoliłbym kodowi Doctrine używać własnych rzeczy i używać ZF do wszystkiego innego. W ten sposób muszę tylko znać klasy ZF. Pamięć podręczna Doctrine powinna być używana wewnętrznie przez doktrynę dla obiektu bazy danych. ZF ma więcej interfejsów, które są przydatne poza ORM, takie jak interfejs buforowania stron HTML.

Stworzenie kolejnej warstwy byłoby idealne, ale doda kolejną zależność do projektu, więc nie jest zbyt dobra do konserwacji.

Wiem, że w bootstrap konfigurowanie wielu pamięci podręcznych może wydawać się zbędne. Może się pogorszyć, jeśli spróbujesz jednocześnie używać ZF1, Doctrine i ZF2. Ale to bardzo mały stały czas, ponieważ konfigurują tylko zmienne, ale nie łączą się jeszcze z zapleczami.

Z punktu widzenia programowania, konserwacji i obsługi zostawiłbym je w spokoju.

imel96
źródło
3

Powodem, dla którego uważam, że jest to problem, jest to, że podczas ładowania aplikacji muszę skonfigurować dwa sterowniki buforowania - każdy z własną składnią. W ten sposób można łatwo utworzyć niedopasowanie i dlatego nie jest możliwe skonfigurowanie dwóch połączeń z zapleczem buforowania.

Dlaczego nie rozwiązać tego problemu z punktu widzenia „uczynić konfigurację wygodniejszą”?

Innymi słowy, napisz nową klasę, która zaakceptuje twoje dane konfiguracyjne, a następnie zastosuje ją do obu sterowników buforujących. Jasne, nie jest tak elastyczny, ale oznacza to również, że mniej może się nie udać.

Darien
źródło
0

Dlaczego nie stworzyć abstrakcji interfejsu, która może być wyspecjalizowana w każdym frameworku? Napisałbym własny kontroler buforowania za pomocą potrzebnych mi metod, które obejmowałyby obie pamięci podręczne. Wtedy mogę o nich zapomnieć i porozmawiać tylko z moim Kontrolerem. Masz jakieś problemy z tym rozwiązaniem?

Dmitri Zaitsev
źródło