Immagina di avere un modello di dati ricco rappresentato da una gerarchia di oggetti.
Ho anche una gerarchia delle viste con viste che possono estrarre i dati richiesti dagli oggetti del modello e visualizzare i dati (e consentire all'utente di manipolare i dati).
In realtà, potrebbero esserci più gerarchie di viste che possono rappresentare e manipolare il modello (ad esempio una vista panoramica-dettagli e una vista manipolazione diretta).
Il mio attuale approccio per questo è che il livello controller memorizzi un riferimento all'oggetto modello sottostante nell'oggetto View. L'oggetto vista può quindi ottenere i dati correnti dal modello per la visualizzazione e può inviare i messaggi dell'oggetto modello per aggiornare i dati. Gli oggetti di vista sono effettivamente osservatori degli oggetti del modello e gli oggetti del modello trasmettono notifiche quando cambiano le proprietà.
Questo approccio consente a tutte le viste di aggiornarsi simultaneamente quando una vista cambia il modello.
Implementato con attenzione, tutto funziona. Tuttavia, richiede molto lavoro per garantire che nessuna vista o oggetti modello mantengano riferimenti stantii agli oggetti del modello. L'utente può eliminare oggetti modello o sotto-gerarchie del modello in qualsiasi momento. Garantire che tutti gli oggetti vista che contengono riferimenti agli oggetti del modello che sono stati cancellati richiede tempo e difficoltà.
Sembra che l'approccio che ho intrapreso non sia particolarmente pulito; anche se non voglio avere codice esplicito nel livello controller per mediare la comunicazione tra le viste e il modello, sembra che ci debba essere un approccio migliore (implicito) per stabilire i collegamenti tra la vista e il modello e tra oggetti modello correlati.
In particolare, sto cercando un approccio (in C ++) che comprenda due punti chiave:
- Esiste una relazione molti a uno tra la vista e gli oggetti del modello
- Se l'oggetto modello sottostante viene distrutto, tutti gli oggetti di visualizzazione dipendenti devono essere ripuliti in modo che non esistano riferimenti stantii
Mentre shared_ptr e weak_ptr possono essere usati per gestire le durate degli oggetti del modello sottostante e consente riferimenti deboli dalla vista al modello, non forniscono la notifica della distruzione dell'oggetto sottostante (lo fanno nel percepire che l'uso di un weak_ptr obsoleto consente la notifica), ma ho bisogno di un approccio che notifica agli oggetti dipendenti che il loro riferimento debole sta andando via.
Qualcuno può suggerire una buona strategia per gestirlo?