Sicuramente la maggior parte di voi ricorda l'applicazione Norton Commander dove dati simili (a volte uguali) vengono visualizzati in viste separate disaccoppiate .
Sto costruendo un'applicazione web che segue lo stesso principio. La quantità di dati è troppo grande per essere recuperata / visualizzata interamente nella pagina e i sottoinsiemi di dati potenzialmente sovrapposti devono essere visualizzati in viste separate.
La mia architettura ha questo aspetto:
┌──────── EventBus ────────┐ │ │ │ │ StorageService │ │ ╱ ╲ │ PresenterLeft┤ ├PresenterRight ╱ ╲ ╲ ╱ ╱ ╲ ViewLeft ModelLeft ModelRight ViewRight
L'applicazione crea entrambi i relatori e passa loro l'istanza di EventBus e StorageService. I presentatori, a loro volta, creano i rispettivi modelli e punti di vista. StorageService viene passato ai modelli. La comunicazione tra i presentatori avviene tramite l'EventBus.
In questo scenario il lato sinistro non ha consapevolezza del lato destro, tuttavia i modelli dovrebbero possedere le stesse informazioni senza la necessità di effettuare un doppio round trip sul server.
Per raggiungere questo obiettivo, utilizzo lo StorageService. I modelli implementano il metodo model.fetch()
che richiede l'archiviazione per i dati. Se gli stessi dati sono stati precedentemente richiesti, lo storage lo restituirà semplicemente come una cache in memoria.
Ecco la vera domanda. Nel contesto precedente, come progettare una struttura dati per un servizio di archiviazione efficiente dal punto di vista della rete per il seguente caso d'uso:
- Richieste di modello a sinistra
GET /files?limit=100
- Richieste di modello giuste
GET /files?limit=110
(ma in realtà ho bisogno solo degli ultimi 10)
Il mio tentativo di approccio era:
- memorizza le richieste fatte dai modelli
- per ogni richiesta aggiuntiva, fai del mio meglio per capire la richiesta di diff
- fai la richiesta di diff (ad esempio
GET /files?offset=100&limit=10
) - archivia gli elementi recuperati in
{"files": {"id1": item1, ..., "id110": item110}}
Purtroppo i passaggi precedenti non aiutano, perché non c'è alcuna relazione tra l'url e gli id. Quando un modello richiede il prossimo set di valori, non so mai se si trovano effettivamente nella cache in memoria.
Ovviamente, potrei usare la strategia di caching in-memory per-url, ma poi avrei delle voci duplicate nella cache, cosa che vorrei evitare.
Quali sono i tuoi pensieri? Mi sento come se stessi reinventando la ruota qui. Esiste un metodo migliore / più semplice / comunemente accettato? Forse la mia architettura è difettosa ...