Elaborazione di più tipi di messaggi in più modi

1

In un'applicazione di chat ci possono essere più tipi di messaggi in arrivo da gestire. Ad esempio, ho messaggi di questo tipo: testo, collegamento, immagine e video. Il testo e il collegamento vengono gestiti allo stesso modo, ma l'immagine e il video richiedono il download del file da un altro server.

Inoltre, potrebbe essere necessario eliminare ogni messaggio. Anche l'eliminazione di ogni messaggio può essere diversa, ad esempio i messaggi di testo e di collegamento devono solo essere eliminati da un database, ma l'immagine e il video potrebbero richiedere l'eliminazione del file associato. Potrebbero esserci più operazioni di questo tipo sui messaggi supportati su alcuni tipi di messaggi, ad esempio il download di nuovi tentativi in caso di immagini e video.

Ho pensato di utilizzare la doppia spedizione con il modello di visitatore ma non si adatta correttamente. Ho bisogno di qualcosa come la tripla spedizione ma non sono sicuro di quale sia il design migliore.

In futuro potrebbero esserci più tipi di messaggi che potrebbero richiedere diversi tipi di elaborazione. Quale tipo di design garantirà l'aggiunta di un tipo di messaggio meno invasivo al codice dell'infrastruttura? Preferibilmente senza aggiungere elementi alle istruzioni "if" o ai blocchi "switch case".

    
posta Abdullah 17.06.2017 - 16:20
fonte

2 risposte

2

Oh ragazzo, ci sono molte cose qui.

Innanzitutto, né la doppia spedizione né la tripla spedizione ti aiuteranno in questo.

Stai incontrando tutti gli stessi problemi in cui viene eseguito un browser web. Potresti risolvere questi problemi allo stesso modo. Testo, Link, immagine e video sono tutti codificati in una lingua testuale. Quel linguaggio è decodificato per decidere come presentarlo. Ciò richiede la capacità di analizzare la lingua. Se vengono citati file remoti, questi vengono scaricati e memorizzati nella cache. Non è necessario eliminarlo a condizione che possano essere sovrascritti liberamente.

Certamente non devi farlo in questo modo. I flussi di dati di immagini e video potrebbero essere inviati direttamente. Ogni messaggio potrebbe avere un campo che annuncia di che tipo è. Se è possibile evitarlo, utilizza il valore di quel campo in una tabella hash o jump per la procedura richiesta dal messaggio. Spero che nessuno mi trasmetta un valore che mi salta alla procedura di formattazione del disco rigido.

Ma non importa come lo fai, qualcosa, da qualche parte, deve decidere come presentare il messaggio che hai ricevuto. Tieni presente che le istruzioni switch sono solo malvagie quando da qualche parte nella tua base di codice ci sono due di esse che attivano la stessa cosa.

    
risposta data 17.06.2017 - 23:39
fonte
1

In the future, there may be more types of messages that may require different type of processing. What type of design will ensure adding a message type is least intrusive to infrastructure code? Preferably without adding items to "if" statements or "switch case" blocks.

Perché non usare CQRS, con un comando ed eventi separati per ogni tipo di messaggio. Quindi per i messaggi di testo avresti il comando SendTextMessage con l'evento TextMessageSent corrispondente; allo stesso modo, per le immagini avresti il comando SendImageMessage con ImageMessageSent corrispondente. Questa architettura rispetta i principi SOLID, in particolare il principio Open close: per ogni nuovo tipo di messaggio si aggiungono solo nuove classi, non è necessario toccare il codice esistente.

Also each message may need to be deleted. Deleting each message may be different as well, for example text and link messages just need to be deleted from a database but image and video may require the associated file to be deleted. There may be more such operations on messages that are supported on some type of message -- for example retry download in case of image and video.

Per questo hai alcuni sagas / process manager che ascoltano gli eventi rilevanti come VideoMessageDeleted che chiamano un codice di infrastruttura che cancella il file corrispondente dalla memoria.

    
risposta data 18.06.2017 - 09:01
fonte