
Envoyé par
CinePhil
Je ne vois pas en quoi c'est problématique avec un singleton, justement ! Le singleton étant instancié par définition une seule fois, c'est juste un objet que j'utilise si nécessaire durant le processus applicatif.
C'est problématique , parce que si dans ta classe tu fais :
MonSingleton.getInstance().fairequelquechose();
Et bien ta classe devient fortement couplé à MonSingleton. Comprendre que si MonSingleton n'existe pas elle ne fonctionnera pas.
Ca peut aussi être un problème si tu veux tester unitairement ta classe.
Ici on est pas face à un problème fonctionnel , mais plutôt architectural. Pour ramener à une bdd ,sujet que tu maîtrise plus , c'est un peu comme une table non normalisé, ça marche, mais c'est pas l'idéal.
Là justement, contrairement à ta suggestion dans ton premier commentaire, je n'ai pas créé de variable globale. À moins que tu considères le singleton comme étant de fait une variable globale ?
Oui c'est le singleton qu'on considère comme variable globale, puisqu'il existe tout le temps et pour tout le monde
Dans ce cas, autant se passer complètement du pattern singleton. Pourtant, j'ai vu dans ton Pry que tu utilises le singleton pour le routeur, ce que j'ai aussi fait de mon côté. Si c'est pertinent pour le routeur, pourquoi ne le serait-ce pas pour la collection d'erreurs éventuelles à afficher à l'utilisateur ?
L'utilisation de singleton c'est un grand débat. Certains te dise qu'il ne faut jamais les utiliser. Je suis plus partisan d'une utilisation réfléchie.
Mais pour le cas du router , c'est pas forcément un bon candidat non plus pour le singleton. J'irais même jusqu'à dire que c'est une erreur de conception de mon Fw , mais comme ça marche et que ça me pose pas de pb je n'y touche pas 
Un bon candidat pour un singleton c'est :
- Une classe qui ne doit avoir qu'une instance
- Une classe qui est tellement utiliser partout que l'injection de dépendance deviendrait ridicule
- Une classe qui gère une ressource accessible par plusieurs partie de ton applicatif.
L'exemple le plus courant c'est une classe de gestion des journaux.
Dans le cas d'un programme avec plusieurs thread (ce qui n'existe pas en php) tu peux avoir des problème d'accès concurrent si ton singleton n'est pas ce qu'on appel thread safe. C'est pas forcément facile car il faut synchroniser les threads entre eux pour pas qu'il y'est de conflits. C'est pourquoi on conseille généralement d'éviter les singleton dans ces cas.
Le cas d'école, j'ai un singleton qui permet d'effacer un fichier ou d'y écrire. J'ai 2 thread qui exactement au même moment font ces deux actions. Si mon sigleton n'est pas thread safe je vais avoir un problème puisque je vais essayer d'écrire dans un fichier qu'un autre thread essai de supprimer.
Donc, apparemment, selon ton propre framework, il y a le routeur. Quoi d'autre ? La classe d'accès à la BDD je suppose ? Et encore une fois, pourquoi pas la collection d'erreurs ?
Attention mon FW n'est en rien une référence en terme d'architecture. je pense que c'est pas mal , mais c'est pas non plus parfait 
Comme déjà dit les Journaux son l'exemple le plus couramment mis en avant pour un singleton.
La BDD éventuellement si celle ci ne gère pas les accès concurrent (sqlite dans certains cas par exemple). En revanche si c'est un serveur comme mysql, postgres, sqlserv , etc , ça n'a pas d'intérêt, ca peut même être intéressant d'avoir plusieurs connexion simultanées.
Pour ta collection d'erreur :
- Qu'est ce qui se passe si tu as 2 instances en même temps ? rien ? => pas de singleton
- Est ce qu'elle gère un accès à une ressource particulière ? non ? => pas de singleton
- Est ce qu'elle utiliser dans toute ton application ? non => pas de singleton
Je me répète mais le singleton c'est un peu débat idéologique sans fin. Il faut je pense limiter son utilisation au strict nécessaire sans tomber dans la phobie du singleton
Partager