¿Quién necesita singletons en PHP?
Tenga en cuenta que casi todas las objeciones a los singletons provienen de puntos de vista técnicos, pero también tienen un alcance MUY limitado. Especialmente para PHP. Primero, enumeraré algunas de las razones para usar singletons, y luego analizaré las objeciones al uso de singletons. Primero, las personas que los necesitan:
- Las personas que están codificando un gran marco / base de código, que se utilizará en muchos entornos diferentes, tendrán que trabajar con marcos / bases de código diferentes previamente existentes, con la necesidad de implementar muchas solicitudes diferentes, cambiantes e incluso caprichosas de clientes / jefes / gestión / líderes de la unidad lo hacen.
Mira, el patrón singleton es auto inclusivo. Cuando se hace, una clase singleton es rígida en cualquier código en el que la incluya, y actúa exactamente como creó sus métodos y variables. Y siempre es el mismo objeto en una solicitud dada. Como no se puede crear dos veces para que sean dos objetos diferentes, usted sabe lo que es un objeto singleton en cualquier punto dado de un código, incluso si el singleton se inserta en dos, tres bases de códigos de espagueti diferentes, antiguas e incluso. Por lo tanto, lo hace más fácil en términos de propósitos de desarrollo, incluso si hay muchas personas trabajando en ese proyecto, cuando ve que un singleton se inicializa en un punto en cualquier base de código dada, sabe qué es, qué hace, cómo funciona. lo hace, y el estado en el que se encuentra. Si se tratara de la clase tradicional, debería realizar un seguimiento de dónde se creó ese objeto por primera vez, qué métodos se invocaron en él hasta ese punto en el código, y su estado particular. Pero, suelte un singleton allí, y si eliminó los métodos adecuados de depuración e información y el seguimiento en el singleton mientras lo codifica, sabrá exactamente qué es. Por lo tanto, hace que sea más fácil para las personas que tienen que trabajar con diferentes bases de código, con la necesidad de integrar el código que se hizo anteriormente con diferentes filosofías, o hecho por personas con las que no tienes contacto. (es decir, proveedor-proyecto-empresa-lo que sea que no haya más, no hay soporte, nada). hace que sea más fácil para las personas que tienen que trabajar con diferentes bases de código, con la necesidad de integrar el código que se hizo anteriormente con diferentes filosofías, o hecho por personas con las que no tienes contacto. (es decir, proveedor-proyecto-empresa-lo que sea que no haya más, no hay soporte, nada). hace que sea más fácil para las personas que tienen que trabajar con diferentes bases de código, con la necesidad de integrar el código que se hizo anteriormente con diferentes filosofías, o hecho por personas con las que no tienes contacto. (es decir, proveedor-proyecto-empresa-lo que sea que no haya más, no hay soporte, nada).
- Personas que necesitan trabajar con API , servicios y sitios web de terceros .
Si observa más de cerca, esto no es muy diferente al caso anterior: las API, servicios y sitios web de terceros son como bases de código externas y aisladas sobre las cuales NO tiene control. Cualquier cosa puede suceder. Por lo tanto, con una clase de sesión / usuario de singleton, puede administrar CUALQUIER tipo de implementación de sesión / autorización de proveedores externos como OpenID , Facebook , Twitter y muchos más, y puede hacer TODOS al mismo tiempo desde el MISMO objeto singleton - que es fácilmente accesible, en un estado conocido en cualquier punto dado en cualquier código en el que lo conecte. Incluso puede crear múltiples sesiones para múltiples API / servicios de terceros diferentes para el MISMO usuario en su propio sitio web / aplicación, y hacer lo que quiera hacer con ellos.
Por supuesto, todo esto también puede ser tono con los métodos tradicionales mediante el uso de clases y objetos normales: el problema aquí es que singleton es más ordenado, más ordenado y, por lo tanto, es más fácil de manejar / probar en comparación con el uso tradicional de clase / objeto en tales situaciones.
- Las personas que necesitan un desarrollo rápido.
El comportamiento global de los singletons facilita la creación de cualquier tipo de código con un marco que tiene una colección de singletons para construir, porque una vez que construye bien sus clases de singleton, los métodos establecidos, maduros y establecidos estarán fácilmente disponibles y Se puede usar en cualquier lugar, en cualquier momento, de manera consistente. Lleva algún tiempo madurar tus clases, pero después de eso, son sólidas, consistentes y útiles. Puede tener tantos métodos en un singleton haciendo lo que quiera, y, aunque esto puede aumentar la huella de memoria del objeto, trae mucho más ahorro de tiempo requerido para un desarrollo rápido, un método que no está utilizando en una instancia determinada de una aplicación se puede usar en otra integrada, y puede simplemente aplicar una nueva función que el cliente / jefe / gerente de proyecto solicita con solo algunas modificaciones.
Tienes la idea. Ahora pasemos a las objeciones a los solteros y la cruzada impía contra algo que es útil :
- La principal objeción es que dificulta las pruebas.
Y realmente, lo hace hasta cierto punto, incluso si puede mitigarse fácilmente tomando las precauciones adecuadas y codificando rutinas de depuración en sus singletons CON la constatación de que va a depurar un singleton. Pero vea, esto no es muy diferente de CUALQUIER otra filosofía / método / patrón de codificación que exista, es solo que, los singletons son relativamente nuevos y no están muy extendidos, por lo que los métodos de prueba actuales terminan siendo incompatibles con ellos. Pero eso no es diferente en ningún aspecto de los lenguajes de programación: diferentes estilos requieren diferentes enfoques.
Un punto en el que esta objeción cae en el plano, ignora el hecho de que las razones por las que las aplicaciones desarrolladas no son para 'probar', y las pruebas no son la única fase / proceso que entra en el desarrollo de una aplicación. Las aplicaciones se desarrollan para uso en producción. Y como expliqué en la sección 'quién necesita los singletons', los singletons pueden llegar a un GRAN acuerdo debido a la complejidad de tener que hacer que un código funcione DENTRO y DENTRO de muchas bases de código / aplicaciones / servicios de terceros diferentes. El tiempo que puede perderse en las pruebas es el tiempo ganado en el desarrollo y la implementación. Esto es especialmente útil en esta era de autenticación / aplicación / integración de terceros: Facebook, Twitter, OpenID, muchos más y quién sabe qué sigue.
Aunque es comprensible, los programadores trabajan en circunstancias muy diferentes dependiendo de su carrera. Y para las personas que trabajan en empresas relativamente grandes con departamentos definidos que atienden software / aplicaciones diferentes y definidas de manera cómoda y sin la condena inminente de recortes / despidos presupuestarios y la necesidad de hacer MUCHAS cosas con muchas cosas diferentes en una manera barata / rápida / confiable, los singletons pueden no parecer tan necesarios. E incluso puede ser una molestia / impedimento para lo que YA tienen.
Pero para aquellos que necesitan trabajar en las trincheras sucias del desarrollo 'ágil', tener que implementar muchas solicitudes diferentes (a veces irrazonables) de su cliente / gerente / proyecto, los singletons son una gracia salvadora debido a razones explicadas anteriormente.
- Otra objeción es que su huella de memoria es mayor
Como existirá un nuevo singleton para cada solicitud de cada cliente, esto PUEDE ser una objeción para PHP. Con singletons mal construidos y usados, la huella de memoria de una aplicación puede ser mayor si la aplicación sirve a muchos usuarios en un punto dado.
Sin embargo, esto es válido para CUALQUIER tipo de enfoque que pueda adoptar al codificar cosas. Las preguntas que deben formularse son: ¿son innecesarios los métodos, los datos que se guardan y procesan estos singletons? Porque, si SON necesarios en muchas de las solicitudes que recibe la aplicación, incluso si no usa singletons, esos métodos y datos ESTARÁN presentes en su aplicación de una forma u otra a través del código. Por lo tanto, todo se convierte en una cuestión de cuánta memoria va a guardar, cuando inicializa un objeto de clase tradicional 1/3 en el procesamiento del código y lo destruye 3/4 en él.
Vea, cuando se pone de esta manera, la pregunta se vuelve bastante irrelevante: no debe haber métodos innecesarios, datos almacenados en objetos en su código en CUALQUIER forma, independientemente de si usa singletons o no. Entonces, esta objeción a los singletons se vuelve realmente graciosa porque ASUME que habrá métodos innecesarios, datos en los objetos creados a partir de las clases que usa.
- Algunas objeciones no válidas como 'hace que el mantenimiento de múltiples conexiones de bases de datos sea imposible / difícil'
Ni siquiera puedo comenzar a comprender esta objeción, cuando todo lo que uno necesita para mantener múltiples conexiones de bases de datos, múltiples selecciones de bases de datos, múltiples consultas de bases de datos, múltiples conjuntos de resultados en un singleton dado es solo mantenerlos en variables / matrices en el singleton siempre que son necesarios Esto puede ser tan simple como mantenerlos en matrices, aunque puede inventar cualquier método que desee utilizar para lograrlo. Pero examinemos el caso más simple, el uso de variables y matrices en un singleton dado:
Imagine que lo siguiente está dentro de una base de datos dada singleton:
$ this -> connections = array (); (sintaxis incorrecta, simplemente lo escribí así para darle la imagen: la declaración adecuada de la variable es public $ connections = array (); y su uso es $ this-> connections ['connectionkey'] naturalmente)
Puede configurar y mantener múltiples conexiones en un momento dado en una matriz de esta manera. Y lo mismo ocurre con las consultas, los conjuntos de resultados, etc.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['particulrconnection']);
Que solo puede hacer una consulta a una base de datos seleccionada con una conexión seleccionada, y simplemente almacenarla en su
$ this -> resultados
matriz con la clave 'queryname'. Por supuesto, necesitará tener su método de consulta codificado para esto, lo cual es trivial.
Esto le permite mantener un número prácticamente infinito de (tanto como los límites de recursos lo permiten, por supuesto) diferentes conexiones de bases de datos y conjuntos de resultados tanto como los necesite. Y están disponibles para CUALQUIER pieza de código en cualquier punto dado en cualquier base de código dada en la que se haya instanciado esta clase singleton.
Por supuesto, naturalmente necesitaría liberar los conjuntos de resultados y las conexiones cuando no sea necesario, pero eso es evidente, y no es específico para singletons o cualquier otro método / estilo / concepto de codificación.
En este punto, puede ver cómo puede mantener múltiples conexiones / estados a aplicaciones o servicios de terceros en el mismo singleton. No tan diferente
En pocas palabras, al final, los patrones singleton son solo otro método / estilo / filosofía para programar, y son tan útiles como CUALQUIER otro cuando se usan en el lugar correcto, de la manera correcta. Lo cual no es diferente de nada.
Notarás que en la mayoría de los artículos en los que se critican los singletons, también verás referencias a que 'globals' son 'malvados'.
Seamos realistas: CUALQUIER cosa que no se usa correctamente, se abusa, se maltrata, ES maldad. Eso no se limita a ningún idioma, ningún concepto de codificación, ningún método. Cada vez que vea a alguien emitiendo declaraciones generales como 'X es malvado', huya de ese artículo. Hay muchas posibilidades de que sea producto de un punto de vista limitado, incluso si el punto de vista es el resultado de años de experiencia en algo en particular, lo que generalmente termina siendo el resultado de trabajar demasiado en un estilo / método dado, el conservadurismo intelectual típico.
Se pueden dar innumerables ejemplos para eso, que van desde 'los globales son malvados' hasta 'los iframes son malos'. Hace unos 10 años, incluso proponer el uso de un iframe en cualquier aplicación era herejía. Luego viene Facebook, iframes en todas partes, y mira lo que ha sucedido: los iframes ya no son tan malvados.
Todavía hay personas que insisten obstinadamente en que son 'malvados', y a veces también por buenas razones, pero, como puede ver, existe una necesidad, los iframes satisfacen esa necesidad y funcionan bien, y por lo tanto, el mundo entero simplemente sigue adelante.
El principal activo de un programador / codificador / ingeniero de software es una mente libre, abierta y flexible.