Dua komponen menawarkan fungsionalitas yang sama, diperlukan oleh dependensi yang berbeda

9

Saya sedang membangun aplikasi dalam PHP, menggunakan Zend Framework 1 dan Doctrine2 sebagai lapisan ORM. Semua berjalan baik. Sekarang, saya kebetulan melihat bahwa baik ZF1 dan Doctrine2 datang dengan, dan bergantung pada, implementasi caching mereka sendiri. Saya telah mengevaluasi keduanya, dan sementara masing-masing memiliki pro dan kontra, tidak satu pun dari mereka menonjol sebagai yang lain untuk kebutuhan sederhana saya. Kedua perpustakaan juga tampaknya ditulis terhadap antarmuka masing-masing, bukan implementasinya.

Alasan mengapa saya merasa ini adalah masalah adalah bahwa selama bootstrap aplikasi saya, saya harus mengkonfigurasi dua driver caching - masing-masing dengan sintaksnya sendiri. Ketidakcocokan mudah dibuat dengan cara ini, dan rasanya tidak efisien untuk mengatur dua koneksi ke backend caching karena ini.

Saya mencoba menentukan apa jalan terbaik ke depan, dan akan menyambut wawasan apa pun yang Anda bisa tawarkan.

Apa yang saya pikirkan sejauh ini adalah empat opsi:

  1. Jangan lakukan apa-apa, terima bahwa ada dua kelas yang menawarkan fungsionalitas caching.
  2. Buat kelas Facade untuk menempelkan antarmuka Zend ke implementasi caching Doctrine.
  3. Opsi 2, sebaliknya - buat Facade untuk memetakan antarmuka Doctrine pada backend Zend Framework.
  4. Gunakan multiple-interface-inheritance untuk membuat satu antarmuka untuk mengatur semuanya, dan berdoa agar tidak ada tumpang tindih (yaitu: jika keduanya memiliki metode "save", mereka harus menerima params dalam urutan yang sama karena PHP kurangnya polimorfisme yang tepat).

Opsi apa yang terbaik, atau adakah varian "Tidak satu pun di atas" yang tidak saya sadari?

kander
sumber
3
Mungkin Anda harus menggambarkan masalahnya dengan pengertian desain perangkat lunak yang lebih umum, untuk orang-orang yang tidak mengerti PHP, ZF atau Doktrin. Apakah kedua perpustakaan itu menyimpan hal yang sama? Jika demikian, mengapa tidak menonaktifkan satu cache? Jika tidak, apa masalahnya? Hal semacam itu.
idoby
Saya sebelumnya telah bekerja dengan .NET CMS yang memiliki penyedia cache akses ORM dan database sendiri. Saya kemudian harus mengintegrasikan CMS dengan platform bisnis kami, yang telah menggunakan penyedia caching yang sama sekali berbeda. Ini telah menyebabkan masalah bagi kami karena penyedia cache di dalam CMS tidak dapat diskalakan ke web farm, ketika penyedia cache platform bisnis kami bisa keluar. Masalah apa yang Anda hadapi?
CodeART
Lihatlah Symfony2 dan bagaimana mereka mengatasi masalah ini.
nietonfir

Jawaban:

7

Jangan apa-apa Terima bahwa proyek terpisah dapat memiliki redundansi selama mereka bekerja di ruang mereka sendiri (tidak saling mencemari cache). Doktrin tahu Zend memiliki caching tetapi mereka tidak ingin bergantung pada Zend dan sebaliknya. Tidak semua orang ingin menggunakan Zend dan Doktrin.

Saya akan membiarkan kode Doktrin menggunakan barangnya sendiri dan menggunakan ZF untuk yang lainnya. Dengan cara ini saya hanya perlu tahu kelas ZF. Cache doktrin hanya boleh digunakan secara internal oleh doktrin untuk objek basis data. ZF memiliki lebih banyak ujung depan yang berguna di luar ORM, seperti ujung depan halaman caching html.

Membuat layer lain akan ideal tetapi akan menambah ketergantungan pada proyek, jadi tidak terlalu baik untuk pemeliharaan.

Saya tahu bahwa di bootstrap dapat terlihat berlebihan untuk mengatur beberapa cache. Ini bisa menjadi lebih buruk jika Anda mencoba menggunakan ZF1, Doctrine dan ZF2 secara bersamaan. Tetapi ini adalah waktu konstan yang sangat kecil karena mereka hanya mengatur variabel, belum terhubung ke ujung belakang.

Jadi, dari perspektif pemrograman, pemeliharaan dan operasi, saya hanya akan membiarkannya.

imel96
sumber
3

Alasan mengapa saya merasa ini adalah masalah adalah bahwa selama bootstrap aplikasi saya, saya harus mengkonfigurasi dua driver caching - masing-masing dengan sintaksnya sendiri. Ketidakcocokan mudah dibuat dengan cara ini , dan rasanya tidak efisien untuk mengatur dua koneksi ke backend caching karena ini.

Mengapa tidak mengatasi masalah dari sudut pandang "buat konfigurasi lebih mudah"?

Dengan kata lain, tulis beberapa kelas baru yang menerima data konfigurasi Anda, dan kemudian terapkan pada kedua driver caching. Tentu, ini tidak fleksibel, tetapi itu juga berarti lebih sedikit kesalahan.

Darien
sumber
0

Mengapa tidak membuat abstraksi antarmuka Anda yang dapat dikhususkan untuk masing-masing kerangka kerja? Saya akan menulis Controller cache saya sendiri dengan metode yang saya butuhkan, yang akan merangkum kedua cache. Maka saya bisa melupakan mereka dan hanya berbicara dengan Pengendali saya. Adakah masalah dengan solusi itu?

Dmitri Zaitsev
sumber