Il monopolio è il diavolo e i singoli con stato non di sola lettura / mutevole sono il problema "reale" ...
Dopo aver letto i Singleton sono bugiardi patologici, come suggerito nella risposta di Jason, mi sono imbattuto in questo piccolo bocconcino che fornisce l'esempio meglio presentato di come i singleton vengono spesso utilizzati in modo improprio.
Global è male perché:
- un. Causa conflitto nello spazio dei nomi
- b. Espone lo stato in modo ingiustificato
Quando si tratta di Singletons
- un. Il modo esplicito OO di chiamarli, previene i conflitti, quindi indica a. non è un problema
- b. I singoli senza stato (come le fabbriche) non sono un problema. I singoli con stato possono di nuovo rientrare in due categorie, quelli che sono immutabili o scrivono una volta e ne leggono molti (file di configurazione / proprietà). Questi non sono male. Singleton mutabili, che sono tipi di titolari di riferimento sono quelli di cui stai parlando.
Nell'ultima affermazione si riferisce al concetto del blog di "i single sono bugiardi".
Come si applica a Monopoli?
Per iniziare una partita di monopolio, prima di tutto:
- stabiliamo prima le regole in modo che tutti siano sulla stessa pagina
- a tutti viene dato un inizio uguale all'inizio del gioco
- viene presentato un solo insieme di regole per evitare confusione
- le regole non possono cambiare durante il gioco
Ora, per chiunque non abbia veramente giocato al monopolio, questi standard sono nella migliore delle ipotesi ideali. Una sconfitta nel monopolio è difficile da inghiottire perché, il monopolio riguarda i soldi, se perdi devi guardare scrupolosamente il resto dei giocatori che finiscono il gioco, e le perdite sono di solito rapide e schiaccianti. Quindi, le regole di solito vengono distorte a un certo punto per servire l'interesse personale di alcuni giocatori a spese degli altri.
Quindi stai giocando a monopolio con gli amici Bob, Joe ed Ed. Stai rapidamente costruendo il tuo impero e consumando quote di mercato a un ritmo esponenziale. I tuoi avversari si stanno indebolendo e inizi a sentire l'odore del sangue (in senso figurato). Il tuo amico Bob ha investito tutti i suoi soldi nel bloccare il maggior numero possibile di proprietà di basso valore, ma il suo non sta ricevendo un elevato ritorno sugli investimenti come si aspettava. Bob, come un colpo di sfortuna, atterra sul tuo Boardwalk e viene eliminato dal gioco.
Ora il gioco passa dal lancio dei dadi amichevole agli affari seri. A Bob è stato fatto l'esempio del fallimento e Joe ed Ed non vogliono finire come "quel ragazzo". Quindi, essendo il protagonista, all'improvviso diventi nemico. Joe ed Ed iniziano a praticare scambi sotto il tavolo, iniezioni di denaro dietro la schiena, cambio di casa sottovalutato e in genere qualsiasi cosa per indebolirti come giocatore fino a quando uno di loro non sale in cima.
Quindi, invece di vincere uno di loro, il processo ricomincia da capo. All'improvviso, un insieme finito di regole diventa un bersaglio mobile e il gioco degenera nel tipo di interazioni sociali che costituirebbero la base di ogni programma televisivo di alto livello dopo Survivor. Perché, perché le regole stanno cambiando e non c'è consenso su come / perché / cosa dovrebbero rappresentare e, cosa più importante, non c'è nessuno che prenda le decisioni. Ogni giocatore nel gioco, a quel punto, sta facendo le proprie regole e il caos ne consegue fino a quando due dei giocatori non sono troppo stanchi per mantenere la sciarada e rinunciare lentamente.
Quindi, se un libro delle regole per un gioco rappresentasse accuratamente un singleton, il libro delle regole del monopolio sarebbe un esempio di abuso.
Come si applica alla programmazione?
A parte tutti gli ovvi problemi di sicurezza dei thread e di sincronizzazione che presentano singlet mutabili ... Se si dispone di un set di dati, che è in grado di essere letto / manipolato da più origini diverse contemporaneamente ed esiste durante la vita dell'esecuzione dell'applicazione, è probabilmente un buon momento per fare un passo indietro e chiedere "sto usando il giusto tipo di struttura di dati qui".
Personalmente, ho visto un programmatore abusare di un singleton utilizzandolo come una sorta di archivio contorto tra thread incrociati all'interno di un'applicazione. Avendo lavorato direttamente sul codice, posso attestare che è stato lento (a causa di tutti i blocchi di thread necessari per renderlo thread-safe) e un incubo su cui lavorare (a causa della natura imprevedibile / intermittente dei bug di sincronizzazione), e quasi impossibile testare in condizioni di "produzione". Certo, un sistema avrebbe potuto essere sviluppato utilizzando polling / signaling per superare alcuni dei problemi di prestazioni, ma ciò non risolverebbe i problemi con i test e, perché preoccuparsi quando un database "reale" può già realizzare la stessa funzionalità in un modo molto più robusto / modo scalabile.
Un Singleton è un'opzione solo se hai bisogno di ciò che fornisce un singleton. Un'istanza di sola lettura in scrittura di un oggetto. La stessa regola dovrebbe arrivare anche alle proprietà / ai membri dell'oggetto.