Zwei Komponenten mit derselben Funktionalität, die für unterschiedliche Abhängigkeiten erforderlich sind


9

Ich erstelle eine Anwendung in PHP und verwende Zend Framework 1 und Doctrine2 als ORM-Schicht. Alles läuft gut. Jetzt bemerkte ich zufällig, dass sowohl ZF1 als auch Doctrine2 mit ihrer eigenen Caching-Implementierung geliefert werden und sich darauf verlassen. Ich habe beide bewertet, und obwohl jeder seine eigenen Vor- und Nachteile hat, ist keiner der beiden für meine einfachen Bedürfnisse dem anderen überlegen. Beide Bibliotheken scheinen auch gegen ihre jeweiligen Schnittstellen geschrieben zu sein, nicht gegen ihre Implementierungen.

Gründe, warum ich dies für ein Problem halte, sind, dass ich während des Bootstrapings meiner Anwendung zwei Caching-Treiber konfigurieren muss - jeder mit seiner eigenen Syntax. Auf diese Weise kann leicht eine Nichtübereinstimmung erstellt werden, und es ist aus diesem Grund ineffizient, zwei Verbindungen zum Caching-Backend einzurichten.

Ich versuche herauszufinden, was der beste Weg ist, und würde mich über alle Erkenntnisse freuen, die Sie möglicherweise anbieten können.

Was ich mir bisher ausgedacht habe, sind vier Optionen:

  1. Tun Sie nichts, akzeptieren Sie, dass zwei Klassen mit Caching-Funktionalität vorhanden sind.
  2. Erstellen Sie eine Facade-Klasse, um die Schnittstelle von Zend auf die Caching-Implementierung von Doctrine zu übertragen.
  3. Option 2, umgekehrt: Erstellen Sie eine Fassade, um die Benutzeroberfläche von Doctrine auf einem Zend Framework-Backend abzubilden.
  4. Verwenden Sie die Vererbung mehrerer Schnittstellen, um eine Schnittstelle zu erstellen, die alle regiert, und beten Sie, dass es keine Überlappungen gibt (dh wenn beide eine "Speichermethode" haben, müssen sie aufgrund von PHPs Parameter in derselben Reihenfolge akzeptieren Mangel an richtigem Polymorphismus).

Welche Option ist die beste oder gibt es eine "Keine der oben genannten" Variante, die mir nicht bekannt ist?


3
Vielleicht sollten Sie das Problem in einem allgemeineren Sinne des Software-Designs beschreiben, für Leute, die PHP, ZF oder Doctrine nicht kennen. Zwischenspeichern die beiden Bibliotheken dasselbe? Wenn ja, warum nicht einen Cache deaktivieren? Wenn nicht, wo liegt das Problem? Diese Art von Ding.
Idoby

Ich habe zuvor mit einem .NET-CMS gearbeitet, das über einen eigenen ORM- und Datenbankzugriffs-Cache-Anbieter verfügt. Ich musste dann CMS in unsere Geschäftsplattform integrieren, die einen völlig anderen Caching-Anbieter verwendet hat. Dies hat uns zu einem Problem geführt, da der Cache-Anbieter innerhalb von CMS nicht auf eine Webfarm skalierbar war, als unser Cache-Anbieter für Geschäftsplattformen skaliert werden konnte. Vor welchen Problemen stehen Sie jedoch?
CodeART

Schauen Sie sich Symfony2 an und wie sie dieses Problem gelöst haben.
Nietonfir

Antworten:


7

Nichts tun Akzeptieren Sie, dass separate Projekte redundant sein können, solange sie in ihren eigenen Räumen arbeiten (ohne die Caches gegenseitig zu verschmutzen). Die Lehre weiß, dass Zend Caching hat, aber sie wollen nicht von Zend abhängig sein und umgekehrt. Nicht alle Menschen wollen Zend und Doctrine verwenden.

Ich würde Doctrine Code seine eigenen Sachen verwenden lassen und ZF für alles andere verwenden. Auf diese Weise muss ich nur ZF-Klassen kennen. Der Doktrin-Cache sollte nur intern von der Doktrin für das Datenbankobjekt verwendet werden. ZF verfügt über mehr Front-End, das außerhalb eines ORM nützlich ist, z. B. das Front-End für das Zwischenspeichern von HTML-Seiten.

Das Erstellen einer weiteren Ebene wäre ideal, fügt dem Projekt jedoch eine weitere Abhängigkeit hinzu, sodass die Wartung nicht sehr gut ist.

Ich weiß, dass es im Bootstrap redundant aussehen kann, mehrere Caches einzurichten. Es kann schlimmer werden, wenn Sie versuchen, ZF1, Doctrine und ZF2 gleichzeitig zu verwenden. Aber es ist eine sehr kleine konstante Zeit, da sie nur Variablen einrichten und noch keine Verbindung zu den Backends herstellen.

Aus Sicht der Programmierung, Wartung und des Betriebs würde ich sie einfach in Ruhe lassen.


3

Gründe, warum ich dies für ein Problem halte, sind, dass ich während des Bootstrapings meiner Anwendung zwei Caching-Treiber konfigurieren muss - jeder mit seiner eigenen Syntax. Auf diese Weise kann leicht eine Nichtübereinstimmung erstellt werden , und es ist aus diesem Grund ineffizient, zwei Verbindungen zum Caching-Backend einzurichten.

Warum nicht einfach das Problem unter dem Gesichtspunkt "Konfiguration komfortabler gestalten" angehen?

Mit anderen Worten, schreiben Sie eine neue Klasse, die Ihre Konfigurationsdaten akzeptiert, und wenden Sie sie dann auf beide Caching-Treiber an. Sicher, es ist nicht so flexibel, aber das bedeutet auch, dass weniger schief gehen kann.


0

Warum nicht eine Abstraktion Ihrer Schnittstelle erstellen, die auf jedes der Frameworks spezialisiert werden kann? Ich würde meinen eigenen Cache-Controller mit den von mir benötigten Methoden schreiben, die beide Caches kapseln würden. Dann kann ich sie vergessen und nur mit meinem Controller sprechen. Probleme mit dieser Lösung?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.