2010-07-18 14 views
8

He estado leyendo un poco últimamente sobre el patrón singleton. Al leer los aspectos técnicos del mismo, parece ser ideal para administrar un manejador de base de datos o los "me gusta". Pero después de leer recursos más amplios, parece que la comunidad de desarrolladores realmente no está a favor del patrón.Singleton PHP - controlador de base de datos

Estoy luchando por encontrar una mejor solución para ese problema, es decir, solo se puede inicializar un solo manipulador a la vez, entonces, ¿por qué el patrón es tan malo? ¿Se usa en exceso o es simplemente defectuoso?

Php es el lenguaje que estoy usando.

Respuesta

2

Algunas personas siguen este mantra que los Singletons son malvados porque son como variables globales y hacen que su código sea más difícil de conectar y más difícil de probar.

Por mi parte, no creo que sea una mala idea, y creo que un Singleton funciona bastante bien para un manejador de bases de datos. Es fácil, intuitivo, y usted tiene más control sobre una instancia de Singleton que una variable global.

8

Singletons are glorified global variables. El patrón de diseño se creó para los idiomas en los que las variables globales son difíciles o imposibles, o donde se consideran malas prácticas. (De hecho, la mayoría de los patrones de diseño comunes están diseñados para lenguajes restrictivos. Un gran número de ellos son simplemente innecesarios en otros lenguajes.)

PHP tiene variables globales. Las variables globales de PHP generalmente son una mala práctica, pero existen si necesita usarlas.

Sin embargo, hay algunas razones por las que querría un Singleton en PHP.

Los Singletons son útiles cuando la llamada a getInstance (el nombre canónico para el método que devuelve la instancia única de Singleton) podría hacerme en cualquier punto del script. Hasta ese punto, el objeto no necesita existir. Si el objeto era una variable global en su lugar, o bien debería existir, o el código que trata de hacer referencia al objeto primero tendría que crear una instancia. De hecho, en cualquier lugar donde se pueda usar, necesitaría ser instanciado correctamente. Al centralizar la creación del objeto único en getInstance, evita tener que crear el texto repetitivo de copiar y pegar cada vez que necesita hacer referencia al objeto.

Objetos de base de datos generalmente se crean muy temprano en la vida útil de la solicitud, por lo que se desperdiciaría el beneficio específico de Singleton-ness.

Existen otras alternativas a Singleton que pueden hacer el trabajo de otras maneras. Un ejemplo es dependency injection, un término sofisticado para pasar objetos externos de los que dependería un nuevo objeto (como un identificador de base de datos) al objeto en tiempo de construcción. Sin embargo, esto puede ser complicado o molesto. Hacerlo bien podría implicar la inyección de un lote de los mismos objetos cada vez.

Otra alternativa es el Registry pattern, que es efectivamente un contenedor para cosas que de otro modo serían globales. Si no te gustan las variables globales, pero no te importa que sean efectivamente espacios de nombres, esta sería una solución que te gustaría.

Al final, elija una forma de hacerlo, y quédese con eso de una manera a lo largo de su código base. Personalmente, soy un fanático de que el objeto de base de datos sea global.

+0

Si utiliza algún caché, puede suceder que no se necesita la conexión de base de datos. Además, como el singleton se usa en una clase, es posible usar la carga automática. No creo que Singleton sea malo para el manejo de bases de datos en PHP. – Savageman

+0

Muy cierto. Si tiene una capa de almacenamiento en caché completa entre su código y su base de datos, es muy posible que nunca necesite abrir una conexión al menos una parte del tiempo. – Charles

+0

El punto acerca de las pruebas es muy válido. El principal problema con singleton es que no solo lo restringe a una sola instancia (¿qué hay de dos conexiones de db separadas para separar dbs?) Sino también a una implementación específica. Si desea probar, debe reemplazar su conexión de db con otra cosa. La abstracción se vuelve más difícil porque no es posible extender su singleton. El registro aborda muchos de estos problemas. – igorw

0

No hay nada de malo en el patrón de Singleton, lo uso todo el tiempo.

Como dices, es ideal para recursos que solo debes tener una instancia y que son globales para la aplicación.

Creo que a algunos desarrolladores no les gusta debido a las dependencias que se pueden crear a través de este método. Lea sobre Inyección de Dependencia ya que creo que cubre por qué los Singleton son malos, pero no recuerdo exactamente.

0

Uso un controlador de base de datos singleton para la mayoría de mis aplicaciones web más pequeñas. Cuando se combina con un archivo de configuración externo y PDO como método de acceso a la base de datos, puede ser muy flexible al pasar de un proyecto a otro, siempre que los métodos no sean específicos del modelo de aplicación (es decir, getRow o getAll en lugar de getThing o getBreakfast) . Solo trato de asegurarme de que todas mis constantes de acceso estén definidas por separado.

Una gran parte del disgusto por los singletons se deriva principalmente de los lenguajes más complejos que PHP.

+0

estoy interesado en cómo vincular esto con un archivo de configuración – Bill

+0

@Bill - La mayoría de las aplicaciones que diseño gravitan hacia el patrón de controlador frontal http://www.oreillynet.com/pub/a/php/2004/07/08/ front_controller.html - Así que, básicamente, puedo incluir un archivo config.php que tenga numerosas instrucciones de definición para hacer constantes de creds de acceso a la base de datos tan pronto como se cargue el controlador frontal.Luego, todos los modelos (también el manejador de la base de datos) están incluidos, así que en cualquier lugar de la aplicación puedo realizar mis consultas de base de datos usando ese controlador, ya que todas las partes de la aplicación descienden de ese único punto de entrada. – DeaconDesperado

0

Aparte de la variable global, a la comunidad le desagradan los Singleton porque eventualmente existe la posibilidad de que necesite una instancia adicional de la clase. Por ejemplo, puede usar un Singleton para su conexión de base de datos y funciona de maravilla hasta el momento en que desea conectarse a 2 bases de datos como una vez. En ese momento, puede refactorizar toda su aplicación o copiar y pegar el singleton a una nueva clase y usar eso. De cualquier manera, estás en un cierto arroyo sin remo.

Sin embargo, el patrón Singleton es un patrón de diseño, no una implementación. Nadie dijo que el código que lo restringe a una instancia tiene que estar dentro de la clase. He descubierto que si crea una instancia de la clase mediante un método de fábrica, puede poner la implementación de singleton en el método de fábrica. Entonces, si un día necesita una nueva instancia, puede agregar un nuevo método de fábrica para hacer eso, ya que la clase en sí no tiene ninguna restricción. El precio de esto, por supuesto, es que siempre instancia su singleton a través de una fábrica y no directamente.

Cuestiones relacionadas