Quem precisa de singletons em PHP?
Observe que quase todas as objeções a singletons vêm de pontos de vista técnicos - mas elas também são MUITO limitadas em seu escopo. Especialmente para PHP. Primeiro, listarei algumas das razões para o uso de singletons e, em seguida, analisarei as objeções ao uso de singletons. Primeiro, as pessoas que precisam deles:
- As pessoas que estão codificando uma grande estrutura / base de código, que será usada em muitos ambientes diferentes, terão que trabalhar com estruturas / bases de código diferentes existentes anteriormente, com a necessidade de implementar muitas solicitações diferentes, alteradas e até caprichosas de clientes / chefes / gerência / líderes da unidade fazem.
Veja, o padrão singleton é auto-inclusivo. Quando concluída, uma classe singleton é rígida em qualquer código em que você a inclui e age exatamente como você criou seus métodos e variáveis. E é sempre o mesmo objeto em uma determinada solicitação. Como ele não pode ser criado duas vezes para ser dois objetos diferentes, você sabe o que é um objeto singleton em um determinado momento de um código - mesmo que o singleton seja inserido em duas, três diferentes bases de código espaguete, antigas e até espaguetes. Portanto, torna mais fácil em termos de desenvolvimento - mesmo que haja muitas pessoas trabalhando nesse projeto, quando você vê um singleton sendo inicializado em um ponto em qualquer base de código, você sabe o que é, o que faz, como faz e o estado em que está. Se fosse a classe tradicional, você precisaria acompanhar onde foi criado esse objeto pela primeira vez, quais métodos foram invocados nele até aquele momento no código e seu estado específico. Mas solte um singleton lá e, se você soltar métodos de depuração e informações adequados e rastrear o singleton enquanto o codifica, você sabe exatamente o que é. Portanto, torna mais fácil para as pessoas que precisam trabalhar com diferentes bases de código, com a necessidade de integrar o código que foi feito anteriormente com diferentes filosofias ou com pessoas com as quais você não tem contato. (ou seja, fornecedor-projeto-empresa-o que houver, não há suporte, nada). torna mais fácil para as pessoas que precisam trabalhar com diferentes bases de código, com a necessidade de integrar o código que foi feito anteriormente com diferentes filosofias ou com pessoas com as quais você não tem contato. (ou seja, fornecedor-projeto-empresa-o que houver, não há suporte, nada). torna mais fácil para as pessoas que precisam trabalhar com diferentes bases de código, com a necessidade de integrar o código que foi feito anteriormente com diferentes filosofias ou com pessoas com as quais você não tem contato. (ou seja, fornecedor-projeto-empresa-o que houver, não há suporte, nada).
- Pessoas que precisam trabalhar com APIs , serviços e sites de terceiros .
Se você olhar mais de perto, isso não será muito diferente do caso anterior - APIs, serviços e sites de terceiros são exatamente como bases de código externas e isoladas sobre as quais você NÃO tem controle. Nada pode acontecer. Assim, com uma classe de sessão / usuário singleton, você pode gerenciar QUALQUER tipo de implementação de sessão / autorização de fornecedores terceirizados como OpenID , Facebook , Twitter e muito mais - e você pode fazer tudo isso ao mesmo tempo no mesmo objeto singleton - que é facilmente acessível, em um estado conhecido a qualquer momento em qualquer código em que você o conectar. Você pode até criar várias sessões para várias APIs / serviços de terceiros diferentes para o MESMO usuário em seu próprio site / aplicativo e fazer o que quiser com eles.
Obviamente, tudo isso também pode se harmonizar com os métodos tradicionais usando classes e objetos normais - o problema aqui é que o singleton é mais arrumado, mais limpo e, portanto, por causa disso mais fácil de gerenciar / testável em comparação com o uso tradicional de classe / objeto nessas situações.
- Pessoas que precisam desenvolver rápido
O comportamento global dos singletons facilita a criação de qualquer tipo de código com uma estrutura que possui uma coleção de singletons, porque uma vez que você constrói bem suas classes singleton, os métodos estabelecidos, maduros e definidos estarão facilmente disponíveis e utilizável em qualquer lugar, a qualquer hora, de forma consistente. Leva algum tempo para amadurecer suas aulas, mas depois disso, elas são sólidas, consistentes e úteis. Você pode ter tantos métodos em um singleton fazendo o que quiser e, embora isso possa aumentar a área de armazenamento de memória do objeto, ele traz muito mais economia de tempo necessário para o desenvolvimento rápido - um método que você não está usando em uma determinada instância do um aplicativo pode ser usado em outro integrado e você pode simplesmente adicionar um novo recurso que o cliente / chefe / gerente de projeto solicita com apenas algumas modificações.
Você entendeu a ideia. Agora vamos passar às objeções aos singletons e à cruzada profana contra algo que é útil :
- A principal objeção é que torna os testes mais difíceis.
E realmente, até certo ponto, mesmo que possa ser facilmente mitigado, tomando as devidas precauções e codificando rotinas de depuração em seus singletons, com a constatação de que você estará depurando um singleton. Mas veja, isso não é muito diferente de QUALQUER outra filosofia / método / padrão de codificação disponível - é apenas que, os singletons são relativamente novos e não generalizados, portanto os métodos de teste atuais acabam sendo comparativamente incompatíveis com eles. Mas isso não é diferente em nenhum aspecto das linguagens de programação - estilos diferentes exigem abordagens diferentes.
Um ponto em que essa objeção não é clara é que ignora o fato de que os aplicativos desenvolvidos não são para 'teste' e o teste não é a única fase / processo que entra no desenvolvimento de aplicativos. Os aplicativos são desenvolvidos para uso em produção. E, como expliquei na seção 'quem precisa de singletons', os singletons podem reduzir muito a complexidade de ter que fazer um código funcionar COM e DENTRO de muitas bases de código / aplicativos / serviços de terceiros. O tempo que pode ser perdido nos testes é o tempo ganho em desenvolvimento e implantação. Isso é especialmente útil nesta era de autenticação / aplicativo / integração de terceiros - Facebook, Twitter, OpenID, muito mais e quem sabe o que vem a seguir.
Embora seja compreensível - os programadores trabalham em circunstâncias muito diferentes, dependendo de sua carreira. E para pessoas que trabalham em empresas relativamente grandes, com departamentos definidos, cuidando de software / aplicativos diferentes e definidos de maneira confortável e sem a desgraça iminente de cortes / demissões no orçamento e a necessidade de fazer um monte de coisas com muitas coisas diferentes de uma maneira barata / rápida / confiável, os singletons podem não parecer tão necessários. E pode até ser um incômodo / impedimento para o que JÁ têm.
Mas para quem precisa trabalhar nas trincheiras sujas do desenvolvimento 'ágil', tendo que implementar muitas solicitações diferentes (às vezes irracionais) de seu cliente / gerente / projeto, os singletons são uma graça salvadora devido às razões explicadas anteriormente.
- Outra objeção é que sua pegada de memória é maior
Porque um novo singleton existirá para cada solicitação de cada cliente, isso pode ser uma objeção ao PHP. Com singletons mal construídos e usados, o espaço de memória de um aplicativo pode ser maior se muitos usuários forem atendidos pelo aplicativo em um determinado momento.
No entanto, isso é válido para QUALQUER tipo de abordagem que você pode adotar ao codificar as coisas. As perguntas que devem ser feitas são: os métodos, os dados mantidos e processados por esses singletons são desnecessários? Pois, se eles são necessários em muitas solicitações que o aplicativo está recebendo, mesmo que você não use singletons, esses métodos e dados estarão presentes no aplicativo de alguma forma ou de outra através do código. Portanto, tudo se torna uma questão de quanta memória você estará economizando quando você inicializa um objeto de classe tradicional 1/3 no processamento de código e o destrói 3/4 nele.
Veja, quando colocada dessa maneira, a questão se torna bastante irrelevante - não deve haver métodos desnecessários, dados mantidos em objetos em seu código de qualquer maneira - independentemente de você usar singletons ou não. Portanto, essa objeção a singletons se torna realmente hilária, pois ASSUME que haverá métodos desnecessários, dados nos objetos criados a partir das classes que você usa.
- Algumas objeções inválidas como 'tornam impossível / difícil manter várias conexões com o banco de dados'
Eu não posso nem começar a entender essa objeção, quando todos precisam manter várias conexões com o banco de dados, várias seleções de banco de dados, várias consultas ao banco de dados, vários conjuntos de resultados em um determinado singleton, apenas os mantêm em variáveis / matrizes no singleton, desde que eles são necessários. Isso pode ser tão simples quanto mantê-los em matrizes, embora você possa inventar qualquer método que queira usar para efetuar isso. Mas vamos examinar o caso mais simples, o uso de variáveis e matrizes em um determinado singleton:
Imagine o seguinte abaixo dentro de um único banco de dados singleton:
$ this -> connections = array (); (sintaxe incorreta, digitei-a assim para fornecer uma imagem - a declaração apropriada da variável é public $ connections = array (); e seu uso é $ this-> connections ['connectionkey'] naturalmente)
Você pode configurar e manter várias conexões a qualquer momento em uma matriz dessa maneira. E o mesmo vale para consultas, conjuntos de resultados e assim por diante.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['particulrconnection']);
O que pode apenas fazer uma consulta a um banco de dados selecionado com uma conexão selecionada e apenas armazenar no seu
$ this -> resultados
matriz com a chave 'queryname'. Obviamente, você precisará ter seu método de consulta codificado para isso - o que é trivial.
Isso permite que você mantenha um número praticamente infinito de (até onde os limites de recursos permitirem) diferentes conexões com o banco de dados e conjuntos de resultados, conforme necessário. E eles estão disponíveis para QUALQUER parte do código em qualquer ponto em qualquer base de código em que essa classe singleton tenha sido instanciada.
É claro que você naturalmente precisará liberar os conjuntos de resultados e as conexões quando não forem necessários - mas isso não é preciso dizer, e não é específico para singletons ou qualquer outro método / estilo / conceito de codificação.
Neste ponto, você pode ver como manter várias conexões / estados com aplicativos ou serviços de terceiros no mesmo singleton. Não é tão diferente.
Para encurtar a história, no final, os padrões singleton são apenas mais um método / estilo / filosofia para programar, e são tão úteis quanto QUALQUER outro quando usados no lugar correto, da maneira correta. O que não é diferente de nada.
Você notará que na maioria dos artigos em que os singletons são esmagados, você também verá referências a 'globais' como 'maus'.
Vamos ser sinceros - Qualquer coisa que não seja usada corretamente, abusada, mal utilizada, É má. Isso não se limita a nenhum idioma, nenhum conceito de codificação, nenhum método. Sempre que vir alguém emitindo declarações gerais como 'X é mau', fuja desse artigo. As chances são muito altas de que é o produto de um ponto de vista limitado - mesmo que o resultado seja o resultado de anos de experiência em algo específico - que geralmente acaba sendo o resultado de trabalhar demais em um determinado estilo / método - típico conservadorismo intelectual.
Exemplos infinitos podem ser dados para isso, variando de 'globais são maus' a 'iframes são maus'. Há cerca de 10 anos, até propor o uso de um iframe em qualquer aplicativo era heresia. Depois vem o Facebook, iframes em todos os lugares, e veja o que aconteceu - os iframes não são mais tão maus.
Ainda existem pessoas que teimosamente insistem que são 'más' - e às vezes também por boas razões - mas, como você pode ver, há uma necessidade, os iframes preenchem essa necessidade e funcionam bem e, portanto, o mundo inteiro segue em frente.
O principal ativo de um programador / programador / engenheiro de software é uma mente livre, aberta e flexível.