Sono un po 'nuovo di OOP, quindi nutro ancora qualche dubbio quando si tratta di come oggetti diversi dovrebbero comunicare tra loro. Ho un caso concreto in cui non riesco a capire quale sia il miglior design tra i due che mi è venuto in mente.
Fondamentalmente, sto costruendo un'interfaccia utente web (HTML + javascript) in cui ci sono tre giocatori principali:
- un mucchio di oggetti multimediali (foto, video)
- un MediaManager (un contenitore per l'Italia media, carica nuovi media quando necessario, ecc.),
- e un MediaViewer (uno stage a schermo intero che mostra i contenuti multimediali a schermo intero, quando vengono cliccati).
Ora, facendo clic su un media si attiverà il suo metodo view () che apre MediaViewer e imposta il suo contenuto su quello del Media su cui è stato fatto clic.
Una volta che il Viewer è aperto, l'utente può navigare ulteriormente attraverso i media usando i tasti freccia della tastiera. Il media successivo o precedente da mostrare, quando si fa clic su una freccia, viene deciso dal MediaManager: il gestore ha una proprietà .currentlyViewed con il media corrente che viene visualizzato, oltre a un elenco di tutti i media, in modo che sappia quale media viene Il prossimo.
Il mio dubbio riguarda il modo migliore per mantenere aggiornata questa proprietà .currentlyViewed.
Opzione 1:
Passa un riferimento dell'istanza di MediaManager a ciascun oggetto multimediale durante l'istanziazione e, nel loro metodo view (), fai qualcosa di simile
mediaManager.currentlyViewed = media.id
Questo è quello che sto facendo in questo momento, tuttavia mi sembra sbagliato che gli oggetti multimediali debbano sapere quali proprietà hanno i loro "genitori" e cambiare così direttamente quell'oggetto. Questo è mantenibile a lungo termine, quando avrò bisogno di aggiungere altre funzionalità?
Opzione2:
Rendi i media "osservabili" per le modifiche nel loro stato di visualizzazione, cioè implementa un metodo "registerOnViewCallback".
Quindi è il MediaManager che fa qualcosa del tipo:
media.registerOnViewCallback(
function( mediaId ) {
mediaViewer.currenctlyViewed = mediaId;
} );
ora i media non hanno più bisogno di sapere quali proprietà ha il MediaManager, eseguiranno ciecamente qualunque sia il loro callback. Tuttavia, questo codice è più indiretto e potrebbe essere più dettagliato.
Qual è lo schema migliore, quali problemi si presentano con l'altro e perché?
Grazie.