Come evitare i contenitori negli ascoltatori?

1

Sto usando una classe (chiamiamola ClientImpl ) che ascolta un socket per i messaggi e poi aggiorna un listener per far sapere a% co_de che un messaggio è arrivato al socket. Il listener non è implementato all'interno di ClientImpl , ma viene passato dalle classi utilizzando ClientImpl . Chiamiamo la mia classe ClientImpl per rendere il problema più facile da discutere. Una cosa importante da notare è che ClientUser ha la proprietà del listener.

Quindi al problema: quando arriva un messaggio, voglio elaborarlo e memorizzarlo per poterlo leggere più tardi. Dato che lavoro con un framework, non posso semplicemente archiviarlo in un file. Deve essere memorizzato nell'heap per essere letto più tardi.

Quindi la domanda "è considerata una cattiva pratica avere un contenitore (array, collezione, ...) all'interno di un listener?". L'ascoltatore è molto specifico e non verrà utilizzato per nessun altro scopo. Altrimenti, ci sono buone opzioni per evitare questo?

Ho provato a pensare ad alcune opzioni, ma tutte queste sarebbero state complicate da implementare (leggi questo come: aggiungi complessità al codice.). Ad esempio, in questo modo è possibile avviare una discussione che verifica continuamente gli aggiornamenti in un buffer listener o rendere ClientUser un Observer. Nessuno di questi modi è molto allettante. Un altro modo sarebbe iniettare una dipendenza a una raccolta esterna. Non mi piace neanche perché creerebbe una responsabilità condivisa per gestire la Collezione. Ciò probabilmente causerà problemi di concorrenza.

    
posta patrik 27.04.2017 - 09:34
fonte

1 risposta

3

Il punto principale del modello di progettazione Listener (o Observer ) consiste nel disaccoppiare l'oggetto che genera eventi dall'oggetto che reagisce agli eventi (il listener / observer ). Non ho sentito nulla che l'ascoltatore dovrebbe essere leggero.

Raccomando solo di usare il buon senso. Preferisci semplicità a ottimizzazione prematura .

Se hai problemi di concorrenza , imposta semplicemente il contenitore in modalità thread-safe.

Se hai problemi di rendimento , inizia a pensare all'ottimizzazione. Ma ottimizza ciò che è il collo di bottiglia . Probabilmente il contenimento del contenitore sarà probabilmente non . Molto probabilmente sarebbe il messaggio processing che impiegherà più tempo. Quindi presenta una variante del modello produttore-consumatore - un thread alimenta solo una coda (questo potrebbe essere il tuo ascoltatore) , un altro thread (o pool di thread) estrae i messaggi dalla coda e li elabora.

Non riesco a vedere avere solo il contenitore nel listener come un grosso problema in generale, a meno che non vi sia un motivo specifico in un caso specifico.

    
risposta data 28.04.2017 - 12:02
fonte

Leggi altre domande sui tag