Background: Ho alcune classi che implementano un pattern di progettazione soggetto/osservatore che ho reso thread-safe. Un subject
notificherà il suo observers
con una semplice chiamata di metodo observer->Notified(this)
se lo observer
è stato creato nello stesso thread della notifica. Ma se lo observer
è stato costruito in un thread diverso, la notifica verrà registrata su un queue
per essere elaborata in seguito dal thread che ha creato lo observer
e quindi è possibile effettuare la chiamata al metodo semplice quando viene elaborato l'evento di notifica.Aiutami a rimuovere un Singleton: cercare un'alternativa
Quindi ... Ho una mappa che associa thread e code che vengono aggiornati quando thread e code sono costruiti e distrutti. Questa mappa utilizza un mutex per proteggere l'accesso multi-thread ad esso.
La mappa è un singleton.
Sono stato colpevole di usare singoletti in passato perché "ce ne sarà solo uno in questa applicazione" e, credetemi, ho pagato la mia penitenza!
Una parte di me non può fare a meno di pensare che in un'applicazione ci sarà solo una mappa code/thread. L'altra voce dice che i singleton non sono buoni e dovresti evitarli.
Mi piace l'idea di rimuovere il singleton e di poterlo mozzare per i miei test di unità. Il problema è che sto attraversando un periodo difficile cercando di pensare a una buona soluzione alternativa.
La "solita" soluzione che ha funzionato in passato consiste nel passare un puntatore all'oggetto da utilizzare invece di fare riferimento al singleton. Penso che sarebbe difficile in questo caso, dal momento che osservatori e soggetti sono 10 penny nella mia applicazione e sarebbe molto imbarazzante dover passare un oggetto mappa coda/thread nel costruttore di ogni singolo osservatore.
Ciò che apprezzo è che potrei avere una sola mappa nella mia applicazione, ma non dovrebbe essere nelle viscere del codice della classe oggetto e osservatore in cui tale decisione è presa.
Forse questo è un singleton valido, ma apprezzerei anche qualsiasi idea su come potrei rimuoverlo.
Grazie.
PS. Ho letto What's Alternative to Singleton e this article menzionato nella risposta accettata. Non posso fare a meno di pensare che ApplicationFactory sia solo un altro singleton con un altro nome. Io davvero non vedo il vantaggio.
Perché vuoi evitare i singleton? Hanno sicuramente il loro posto. Ogni linguaggio può essere usato e abusato. Ma una mappa a livello di applicazione di thread-> notification_queue mi sembra ragionevole. – Mordachai
@Mordachai: Capisco single hanno il loro posto e può ben essere che questo code/thread è perfettamente valida. E 'iniziato solo a me bug quando stavo scrivendo alcuni test di unità ed è appena sentito scomodo avere il singleton lì. –
Che libreria di thread stai usando? – outis