IMHO, Pemrograman Reaktif Fungsional (FRP) dalam arti tertentu adalah cara umum untuk mengatasi pembatalan cache.
Inilah alasannya: data basi dalam terminologi FRP disebut glitch . Salah satu tujuan FRP adalah untuk menjamin tidak adanya gangguan.
FRP dijelaskan lebih rinci dalam pembicaraan 'Esensi FRP' ini dan dalam jawaban SO ini .
Dalam pembicaraan itu Cell
s mewakili Objek / Entitas yang di-cache dan di- Cell
refresh jika salah satu dependensinya di-refresh.
FRP menyembunyikan kode pipa yang terkait dengan grafik ketergantungan dan memastikan bahwa tidak ada yang basi Cell
.
Cara lain (berbeda dari FRP) yang dapat saya pikirkan adalah membungkus nilai yang dihitung (tipe b
) menjadi semacam penulis Monad di Writer (Set (uuid)) b
mana Set (uuid)
(notasi Haskell) berisi semua pengidentifikasi dari nilai-nilai yang dapat berubah di mana nilai yang dihitung b
bergantung. Jadi, uuid
adalah semacam pengenal unik yang mengidentifikasi nilai / variabel yang bisa berubah (katakanlah baris dalam database) tempat b
bergantung yang dihitung .
Gabungkan ide ini dengan kombinator yang beroperasi pada jenis penulis Monad ini dan itu mungkin mengarah pada semacam solusi pembatalan cache umum jika Anda hanya menggunakan kombinator ini untuk menghitung yang baru b
. Kombinator seperti itu (katakanlah versi khusus dari filter
) mengambil monad dan (uuid, a)
-s Writer sebagai input, di mana a
data / variabel yang bisa berubah, diidentifikasi oleh uuid
.
Jadi, setiap kali Anda mengubah data "asli" (uuid, a)
(misalnya data yang dinormalisasi dalam database yang b
dihitung) yang menjadi dasar penghitungan nilai jenis, b
Anda dapat membatalkan cache yang berisi b
jika Anda mengubah nilai apa pun a
yang menjadi tempat b
bergantung nilai yang dihitung. , karena berdasarkan pada Set (uuid)
Penulis Monad Anda dapat mengetahui kapan hal ini terjadi.
Jadi setiap kali Anda memutasi sesuatu dengan yang diberikan uuid
, Anda menyiarkan mutasi ini ke semua cache dan mereka membatalkan nilai b
yang bergantung pada nilai yang bisa berubah yang diidentifikasi dengan kata uuid
karena monad Writer di mana yang b
dibungkus dapat mengetahui apakah itu b
tergantung pada kata uuid
atau tidak.
Tentu saja, ini hanya bermanfaat jika Anda membaca lebih sering daripada menulis.
Pendekatan ketiga, praktis, adalah dengan menggunakan tampilan terwujud dalam database dan menggunakannya sebagai cache. AFAIK mereka juga bertujuan untuk menyelesaikan masalah pembatalan. Ini tentu saja membatasi operasi yang menghubungkan data yang bisa berubah ke data yang diturunkan.