El monopolio es el demonio y los singletons con estado no solo de lectura / mutable son el problema 'real' ...
Después de leer Singletons son mentirosos patológicos, como se sugiere en la respuesta de Jason, me encontré con este pequeño dato que proporciona el mejor ejemplo presentado de cómo los singletons a menudo se usan mal.
Global es malo porque:
- a. Causa conflicto de espacio de nombres
- si. Expone el estado de manera injustificada
Cuando se trata de Singletons
- a. La forma explícita OO de llamarlos evita los conflictos, así que señale a. no es un problema
- si. Los singletons sin estado son (como las fábricas) no son un problema. Los singletons con estado pueden caer nuevamente en dos categorías, aquellas que son inmutables o que escriben una vez y leen muchas (archivos de configuración / propiedad). Estos no son malos. Singletons mutables, que son como titulares de referencias, son de los que estás hablando.
En la última declaración se está refiriendo al concepto del blog de "los solteros son mentirosos".
¿Cómo se aplica esto al Monopolio?
Para comenzar un juego de monopolio, primero:
- establecemos las reglas primero para que todos estén en la misma página
- todos tienen un comienzo igual al comienzo del juego
- solo se presenta un conjunto de reglas para evitar confusiones
- las reglas no pueden cambiar durante el juego
Ahora, para cualquiera que realmente no haya jugado al monopolio, estos estándares son ideales en el mejor de los casos. Una derrota en el monopolio es difícil de tragar porque, el monopolio se trata de dinero, si pierdes tienes que ver minuciosamente al resto de los jugadores terminar el juego, y las pérdidas suelen ser rápidas y aplastantes. Por lo tanto, las reglas generalmente se tuercen en algún momento para servir el interés propio de algunos de los jugadores a expensas de los demás.
Entonces estás jugando al monopolio con tus amigos Bob, Joe y Ed. Estás construyendo rápidamente tu imperio y consumiendo participación de mercado a un ritmo exponencial. Tus oponentes se debilitan y comienzas a oler sangre (en sentido figurado). Su amigo Bob invirtió todo su dinero en bloquear todas las propiedades de bajo valor posibles, pero no está recibiendo un alto retorno de la inversión como esperaba. Bob, como un golpe de mala suerte, aterriza en su Boardwalk y es eliminado del juego.
Ahora el juego pasa de tirar dados amistosamente a asuntos serios. Bob se ha convertido en el ejemplo del fracaso y Joe y Ed no quieren terminar como 'ese tipo'. Entonces, siendo el jugador líder, de repente, te conviertes en el enemigo. Joe y Ed comienzan a practicar intercambios debajo de la mesa, inyecciones de dinero detrás de la espalda, intercambios de casas infravalorados y, en general, cualquier cosa que lo debilite como jugador hasta que uno de ellos llegue a la cima.
Luego, en lugar de que uno de ellos gane, el proceso comienza de nuevo. De repente, un conjunto finito de reglas se convierte en un objetivo en movimiento y el juego degenera en el tipo de interacciones sociales que constituirían la base de cada reality show de televisión de alto nivel desde Survivor. Por qué, porque las reglas están cambiando y no hay consenso sobre cómo / por qué / qué se supone que representan, y lo que es más importante, no hay una sola persona que tome las decisiones. Cada jugador en el juego, en ese momento, está haciendo sus propias reglas y se produce el caos hasta que dos de los jugadores están demasiado cansados para mantener la farsa y rendirse lentamente.
Entonces, si un libro de reglas para un juego representa con precisión un singleton, el libro de reglas de monopolio sería un ejemplo de abuso.
¿Cómo se aplica esto a la programación?
Además de todos los problemas obvios de sincronización y seguridad de subprocesos que presentan los singletons mutables ... Si tiene un conjunto de datos, que puede ser leído / manipulado por múltiples fuentes diferentes al mismo tiempo y existe durante la vida útil de la ejecución de la aplicación, Probablemente sea un buen momento para dar un paso atrás y preguntar "¿Estoy usando el tipo correcto de estructura de datos aquí".
Personalmente, he visto a un programador abusar de un singleton al usarlo como una especie de almacén de bases de datos entrelazadas en una aplicación. Habiendo trabajado en el código directamente, puedo dar fe de que fue lento (debido a todos los bloqueos de hilo necesarios para que sea seguro para el hilo) y una pesadilla para trabajar (debido a la naturaleza impredecible / intermitente de los errores de sincronización), y casi imposible de probar bajo condiciones de 'producción'. Claro, un sistema podría haberse desarrollado utilizando sondeo / señalización para superar algunos de los problemas de rendimiento, pero eso no resolvería los problemas con las pruebas y, ¿por qué molestarse cuando una base de datos 'real' ya puede lograr la misma funcionalidad en un sistema mucho más robusto? / manera escalable.
Un Singleton es solo una opción si necesita lo que proporciona un Singleton. Una instancia de solo lectura de escritura de un objeto. Esa misma regla también debería conectarse en cascada con las propiedades / miembros del objeto.