Qui a besoin de singletons en PHP?
Notez que presque toutes les objections aux singletons proviennent de points de vue techniques - mais elles sont également TRÈS limitées dans leur portée. Surtout pour PHP. Tout d'abord, je vais énumérer certaines des raisons d'utiliser des singletons, puis j'analyserai les objections à l'utilisation des singletons. Premièrement, les personnes qui en ont besoin:
- Les personnes qui codent un grand framework / base de code, qui sera utilisé dans de nombreux environnements différents, devront travailler avec différents frameworks / bases de code déjà existants, avec la nécessité de mettre en œuvre de nombreuses demandes différentes, changeantes, voire fantaisistes de la part des clients / patrons / direction / chefs d'unité le font.
Vous voyez, le modèle singleton est auto-inclusif. Une fois terminé, une classe singleton est rigide dans tout code dans lequel vous l'incluez et agit exactement comme vous avez créé ses méthodes et ses variables. Et c'est toujours le même objet dans une requête donnée. Puisqu'il ne peut pas être créé deux fois pour être deux objets différents, vous savez ce qu'est un objet singleton à un moment donné dans un code - même si le singleton est inséré dans deux, trois bases de code différentes, anciennes, voire spaghetti. Par conséquent, cela facilite les choses en termes de développement - même si de nombreuses personnes travaillent dans ce projet, lorsque vous voyez un singleton initialisé en un point dans une base de code donnée, vous savez ce que c'est, ce qu'il fait, comment il et l'état dans lequel il se trouve. S'il s'agissait de la classe traditionnelle, vous auriez besoin de garder une trace de l'endroit où cet objet a été créé pour la première fois, quelles méthodes y ont été invoquées jusqu'à ce point dans le code, et son état particulier. Mais, déposez un singleton là-bas, et si vous avez abandonné les méthodes de débogage et d'information appropriées et le suivi dans le singleton lors du codage, vous savez exactement ce que c'est. Donc, par conséquent, cela facilite la tâche aux personnes qui doivent travailler avec des bases de code différentes, avec la nécessité d'intégrer du code qui a été fait auparavant avec des philosophies différentes, ou fait par des personnes avec lesquelles vous n'avez aucun contact. (c'est-à-dire, fournisseur-projet-entreprise-quoi qu'il en soit, pas de support, rien). cela facilite la tâche des personnes qui doivent travailler avec des bases de code différentes, avec la nécessité d'intégrer du code qui a été fait auparavant avec des philosophies différentes, ou fait par des personnes avec lesquelles vous n'avez aucun contact. (c'est-à-dire, fournisseur-projet-entreprise-quoi qu'il en soit, pas de support, rien). cela facilite la tâche des personnes qui doivent travailler avec des bases de code différentes, avec la nécessité d'intégrer du code qui a été fait auparavant avec des philosophies différentes, ou fait par des personnes avec lesquelles vous n'avez aucun contact. (c'est-à-dire, fournisseur-projet-entreprise-quoi qu'il en soit, pas de support, rien).
- Les personnes qui ont besoin de travailler avec des API , des services et des sites Web tiers .
Si vous regardez de plus près, ce n'est pas trop différent du cas précédent: les API, services, sites Web tiers sont comme des bases de code externes et isolées sur lesquelles vous n'avez AUCUN contrôle. Tout peut arriver. Ainsi, avec une session / classe d'utilisateurs singleton, vous pouvez gérer TOUT type d'implémentation de session / autorisation de fournisseurs tiers comme OpenID , Facebook , Twitter et bien d'autres - et vous pouvez tout faire en même temps à partir du même objet singleton - qui est facilement accessible, dans un état connu à tout moment, quel que soit le code auquel vous le branchez. Vous pouvez même créer plusieurs sessions vers plusieurs API / services tiers différents pour le MÊME utilisateur dans votre propre site Web / application, et faire ce que vous voulez en faire.
Bien sûr, tout cela peut également être adapté aux méthodes traditionnelles en utilisant des classes et des objets normaux - le problème ici est que le singleton est plus ordonné, plus net et donc à cause de cela gérable / testable plus facile par rapport à l'utilisation traditionnelle de classe / objet dans de telles situations.
- Les personnes qui ont besoin d'un développement rapide
Le comportement global des singletons facilite la construction de tout type de code avec un framework qui a une collection de singletons sur lesquels construire, car une fois que vous avez bien construit vos classes singleton, les méthodes établies, matures et définies seront facilement disponibles et utilisable partout, à tout moment, de manière cohérente. Il faut du temps pour mûrir vos classes, mais après cela, elles sont solides, cohérentes et utiles. Vous pouvez avoir autant de méthodes dans un singleton faisant ce que vous voulez, et, bien que cela puisse augmenter l'empreinte mémoire de l'objet, cela apporte beaucoup plus d'économies de temps nécessaires pour un développement rapide - une méthode que vous n'utilisez pas dans une instance donnée de une application peut être utilisée dans une autre intégrée, et vous pouvez simplement appliquer une nouvelle fonctionnalité que le client / patron / chef de projet demande juste par quelques modifications.
Vous avez eu l'idée. Passons maintenant aux objections aux singletons et à la croisade impie contre quelque chose d'utile :
- La principale objection est que cela rend les tests plus difficiles.
Et vraiment, dans une certaine mesure, même si cela peut être facilement atténué en prenant les précautions appropriées et en codant des routines de débogage dans vos singletons AVEC la réalisation que vous allez déboguer un singleton. Mais voyez, ce n'est pas trop différent de TOUTE autre philosophie / méthode / modèle de codage qui existe - c'est juste que les singletons sont relativement nouveaux et peu répandus, de sorte que les méthodes de test actuelles finissent par être comparativement incompatibles avec eux. Mais ce n'est différent dans aucun aspect des langages de programmation - différents styles nécessitent des approches différentes.
Un point où cette objection tombe à plat en ce sens qu'elle ignore le fait que les raisons pour lesquelles les applications développées ne sont pas destinées à «tester», et que les tests ne sont pas la seule phase / processus qui entre dans le développement d'une application. Les applications sont développées pour une utilisation en production. Et comme je l'ai expliqué dans la section `` qui a besoin de singletons '', les singletons peuvent réduire considérablement la complexité de devoir faire fonctionner un code AVEC et À L'INTÉRIEUR de nombreuses bases de code / applications / services tiers différents. Le temps qui peut être perdu lors des tests est du temps gagné en développement et en déploiement. Ceci est particulièrement utile à cette époque d'authentification / d'application / d'intégration tierce - Facebook, Twitter, OpenID, bien d'autres et qui sait ce qui va suivre.
Bien que cela soit compréhensible, les programmeurs travaillent dans des circonstances très différentes en fonction de leur carrière. Et pour les personnes qui travaillent dans des entreprises relativement grandes avec des départements définis tendant des logiciels / applications différents et définis de manière confortable et sans la condamnation imminente de coupes budgétaires / licenciements et le besoin qui l'accompagne de faire BEAUCOUP de choses avec beaucoup de choses différentes dans une mode bon marché / rapide / fiable, les singletons peuvent ne pas sembler si nécessaires. Et cela peut même être une nuisance / un obstacle à ce qu'ils ont DÉJÀ.
Mais pour ceux qui ont besoin de travailler dans les tranchées sales du développement `` agile '', devant implémenter de nombreuses demandes différentes (parfois déraisonnables) de leur client / manager / projet, les singletons sont une grâce salvatrice pour des raisons expliquées précédemment.
- Une autre objection est que son empreinte mémoire est plus élevée
Parce qu'un nouveau singleton existera pour chaque requête de chaque client, cela PEUT être une objection pour PHP. Avec des singletons mal construits et utilisés, l'empreinte mémoire d'une application peut être plus élevée si de nombreux utilisateurs sont servis par l'application à un moment donné.
Cependant, cela est valable pour TOUT type d'approche que vous pouvez adopter lors du codage des choses. Les questions à se poser sont: les méthodes, les données qui sont détenues et traitées par ces singletons sont-elles inutiles? Car, si elles SONT nécessaires dans la plupart des requêtes que l'application reçoit, alors même si vous n'utilisez pas de singletons, ces méthodes et données SERONT présentes dans votre application sous une forme ou une autre via le code. Donc, tout devient une question de savoir combien de mémoire allez-vous économiser, lorsque vous initialisez un objet de classe traditionnel 1/3 dans le traitement du code et que vous le détruisez aux 3/4.
Voyez, lorsqu'elle est posée de cette façon, la question devient tout à fait hors de propos - il ne devrait pas y avoir de méthodes inutiles, de données contenues dans des objets dans votre code de toute façon - que vous utilisiez des singletons ou non. Donc, cette objection aux singletons devient vraiment hilarante en cela, elle suppose qu'il y aura des méthodes inutiles, des données dans les objets créés à partir des classes que vous utilisez.
- Certaines objections invalides telles que `` rend le maintien de plusieurs connexions de base de données impossible / plus difficile ''
Je ne peux même pas commencer à comprendre cette objection, quand tout ce dont on a besoin pour maintenir plusieurs connexions de base de données, plusieurs sélections de base de données, plusieurs requêtes de base de données, plusieurs ensembles de résultats dans un singleton donné est simplement de les garder dans des variables / tableaux dans le singleton aussi longtemps que ils sont nécessaires. Cela peut être aussi simple que de les conserver dans des tableaux, bien que vous puissiez inventer la méthode que vous souhaitez utiliser pour effectuer cela. Mais examinons le cas le plus simple, l'utilisation de variables et de tableaux dans un singleton donné:
Imaginez que ce qui suit est à l'intérieur d'un singleton de base de données donné:
$ this -> connections = array (); (mauvaise syntaxe, je l'ai juste tapée comme ceci pour vous donner l'image - la déclaration correcte de la variable est public $ connections = array (); et son utilisation est $ this-> connections ['connectionkey'] naturellement)
Vous pouvez configurer et conserver plusieurs connexions à tout moment dans un tableau de cette manière. Et il en va de même pour les requêtes, les ensembles de résultats, etc.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['particulrconnection']);
Ce qui peut simplement faire une requête à une base de données sélectionnée avec une connexion sélectionnée, et simplement stocker dans votre
$ this -> résultats
tableau avec la clé 'queryname'. Bien sûr, vous devrez avoir votre méthode de requête codée pour cela - ce qui est simple à faire.
Cela vous permet de maintenir un nombre pratiquement infini de connexions de base de données et d'ensembles de résultats différents (autant que les limites de ressources le permettent bien sûr) autant que vous en avez besoin. Et ils sont disponibles pour N'IMPORTE QUEL morceau de code en un point donné de n'importe quelle base de code donnée dans laquelle cette classe singleton a été instanciée.
Bien sûr, vous auriez naturellement besoin de libérer les ensembles de résultats et les connexions lorsque cela n'est pas nécessaire - mais cela va sans dire, et ce n'est pas spécifique aux singletons ou à toute autre méthode / style / concept de codage.
À ce stade, vous pouvez voir comment vous pouvez gérer plusieurs connexions / états à des applications ou services tiers dans le même singleton. Pas si différent.
Bref, en fin de compte, les modèles singleton ne sont qu'une autre méthode / style / philosophie pour programmer, et ils sont aussi utiles que TOUT autre lorsqu'ils sont utilisés au bon endroit, de la manière correcte. Ce qui n'est différent de rien.
Vous remarquerez que dans la plupart des articles dans lesquels les singletons sont critiqués, vous verrez également des références à des «globaux» qui sont «mauvais».
Regardons les choses en face - tout ce qui n'est pas utilisé correctement, maltraité, mal utilisé, EST mal. Cela ne se limite à aucun langage, aucun concept de codage, aucune méthode. Chaque fois que vous voyez quelqu'un émettre des déclarations générales comme «X is evil», fuyez cet article. Il y a de fortes chances que ce soit le produit d'un point de vue limité - même si le point de vue est le résultat d'années d'expérience dans quelque chose de particulier - qui finit généralement par être le résultat d'un travail excessif dans un style / méthode donné - conservatisme intellectuel typique.
Des exemples sans fin peuvent être donnés pour cela, allant de «les globaux sont mauvais» à «les iframes sont mauvais». Il y a environ 10 ans, même proposer l'utilisation d'une iframe dans une application donnée était une hérésie. Ensuite vient Facebook, des iframes partout, et regardez ce qui s'est passé - les iframes ne sont plus si maléfiques.
Il y a encore des gens qui insistent obstinément sur le fait qu'ils sont `` mauvais '' - et parfois pour de bonnes raisons aussi - mais, comme vous pouvez le voir, il y a un besoin, les iframes remplissent ce besoin et fonctionnent bien, et par conséquent, le monde entier continue de bouger.
L'atout principal d'un programmeur / codeur / ingénieur logiciel est un esprit libre, ouvert et flexible.