2012-01-08 8 views
23

Duplicar posibles:
Who needs singletons?La mejor práctica en las clases simples PHP

siempre escribo con respecto a mejores prácticas, pero también quiero entender por qué una cosa dada es una mejor práctica.

He leído en un artículo (desafortunadamente no recuerdo) que las clases singleton son preferidas para crear instancias, en lugar de estar hechas con funciones estáticas y accedidas con el operador de resolución de alcance (: :). Así que si tengo una clase que contiene todas mis herramientas para validar, en pocas palabras:

class validate { 
    private function __construct(){} 
    public static function email($input){ 
     return true; 
    } 
} 

Me han dicho que esto se considera una mala práctica (o al menos advertido en contra), debido a cosas tales como la recolector de basura y mantenimiento. Entonces, lo que las críticas de la "clase singleton como métodos estáticos" quieren, es que instanciar una clase, estoy 100% seguro de que solo crearé una instancia una vez. Para mí, parece hacer un "doble trabajo", porque está todo listo allí. ¿Qué me estoy perdiendo?

¿Cuál es la opinión al respecto? Por supuesto, no es un problema de vida o muerte, pero uno también podría hacer una cosa de la manera correcta, si la opción está ahí :)

+1

posible duplicado de [¿Quién necesita singletons?] (Http://stackoverflow.com/a/4596323/208809) – Gordon

Respuesta

51
+1

Gracias por los enlaces; Ya los estoy leyendo. Creo que podría haber malinterpretado lo que es un singleton sin embargo (que se señala en la respuesta a continuación) –

+0

@ MarkHünermundJensen Pensé que leer su pregunta. Tats por qué publicó los enlaces;). – ThinkingMonkey

+1

Tenga en cuenta que la Inyección de Dependencia no es igual al Contenedor de Inyección de Dependencia. DI es definitivamente una buena cosa; DIC es una forma de implementar esto y no es necesariamente una solución única para todos (a pesar de que en este momento está muy de moda en el mundo de PHP). Un localizador de servicios o un patrón similar también podría ser una forma aceptable de romper dependencias. – liquorvicar

2

Bueno, esto no es en realidad un singleton; un singleton asegura que solo tiene una sola instancia de una clase, y no hay ningún método aquí que recupere una única instancia de Validate. Su diseño aquí parece ser una clase estática. Esto no causará un problema con el recolector de basura (al menos el código que ha colocado aquí), porque esto se cargaría en la memoria sin importar qué.

+0

Eso sin duda explicaría por qué no puedo encontrar la lógica ya que este tipo de clase sería un problema. Entonces, un singleton no es, por ejemplo, una clase que solo se instancia una vez, pero el método también se llama solo una vez. –

5

Un objeto singleton es un objeto que sólo se crea una instancia de una vez. Ese no es el mismo que el Singleton Pattern, que es un (anti) Patrón de cómo escribir una clase que puede sólo se pueden crear instancias de una vez, la Singleton (grande S al principio):

"Asegúrese de que una clase tenga solo una instancia y proporcione un punto de acceso global a ella."

En lo que respecta a PHP, normalmente no es necesario implementar el patrón Singleton. De hecho, debe evitar hacer eso cuando solicite mejor práctica, porque es mala práctica.

Además, la mayoría de los ejemplos de código PHP que se encuentran son implementaciones medio listas del patrón que descuidan cómo funciona PHP. Estas implementaciones falsas no se ajustan a la "garantía" en el patrón.

Esto también dice algo: A menudo no es necesario. Si una implementación descuidada ya hace el trabajo sin siquiera acercarse a lo que es el patrón, el patrón incorrecto se ha utilizado para la situación, está empezando a convertirse en Anti-Pattern.

En PHP normalmente no hay necesidad de asegurar a toda costa que una clase tiene solo una instancia, las aplicaciones PHP no son tan complejas como las que necesita (por ejemplo, no hay múltiples hilos que puedan necesitar referirse a un atómico ejemplo).

Lo que a menudo queda es el punto de acceso global a la instancia de la clase, que es para lo que la mayoría de los desarrolladores de PHP (mal) usan el patrón. Como se lo conoce hoy en día, el uso de tales "Singletons" lleva a los problemas estándar del estado estático global que introducen complejidad en su código en múltiples niveles y reducen la reutilización. Como programador, pierde la capacidad de usar su código de manera flexible. Pero la flexibilidad es una técnica muy importante para resolver problemas. Y los programadores están resolviendo problemas todo el día.

Por lo tanto, antes de aplicar un patrón de diseño es necesario evaluar los pro y los contras. Solo el uso de un patrón con más frecuencia no es útil.

Para empezar, solo escriba sus clases y tenga cuidado de cómo y cuándo se crean instancias en alguna otra parte de la lógica de la aplicación para que las cosas se mantengan flexibles.

+0

Excelente respuesta - Gracias :) –

+3

Su primera frase es contradictoria :). -1. También -1 para "las aplicaciones PHP no son tan complejas". Puede escribir software complejo usando cualquier idioma. Los patrones de diseño están relacionados con la arquitectura del software y no con la tecnología de subcapa. Yo triples downvote pero no puedo. :) –

+0

@Geo C. Una razón por la que escribí es que las aplicaciones PHP normalmente no necesitan atomicidad en los procesos y subprocesos que son un caso de uso de singleton seguros para subprocesos en * más * software complejo. Quizás juzgues demasiado rápido porque crees que atacó un idioma específico, pero ese no es el caso. Es solo que el código PHP común no necesita la implementación del patrón. En caso de que aún lo necesite, incluso ofrezco ese patrón en mi blog. – hakre

Cuestiones relacionadas