2010-03-08 4 views
1

Je travaille sur une application Web qui utilise des classes auxiliaires. Ces classes contiennent des fonctions pour diverses opérations telles que la gestion des formulaires.Classe Singleton et utilisation de l'héritage

Parfois, j'ai besoin de ces classes à plus d'un endroit dans mon application, La façon dont je le fais maintenant est de faire un nouvel objet. Je ne peux pas passer la variable, ce sera trop de travail.

Je me demandais d'utiliser des classes singleton pour cela. De cette façon, je suis sûr qu'une seule instance est en cours d'exécution à la fois.

Ma question cependant est quand j'utilise ce modèle, devrais-je faire une classe singleton pour tous les objets, ce serait beaucoup de la réplication de code. Puis-je à la place faire une super classe de superHelper, qui est une classe singleton, puis laisser chaque assistant l'étendre.

Est-ce que ce type de configuration fonctionnerait, ou existe-t-il une autre alternative?

Et si cela fonctionne, est-ce que quelqu'un a des suggestions sur la façon de coder une telle classe superHelper.

Merci les gars

+0

Est-ce que vos classes d'aide peuvent contenir n'importe quel état ou leurs méthodes peuvent-elles être statiques? –

+0

Certains tiennent, et certains peuvent être utilisés comme statiques, je ne pense pas que ce commentaire a beaucoup aidé –

Répondre

0

Je ne peux pas passer la variable, ce sera trop de travail.

Etes-vous sûr? Les gens ont tendance à surestimer l'effort de transmission des dépendances. Si vous le faites dans le constructeur, c'est généralement assez simple à faire. Cela dit, vous pouvez mettre des fonctionnalités partagées dans la portée globale, de différentes façons en PHP. Le plus simple est d'utiliser une fonction globale. Par exemple. une fonction qui n'appartient à aucune classe. Une autre option consiste à utiliser une méthode de classe statique. Ces deux sont très semblables; sauf pour leur syntaxe, ils ont essentiellement les mêmes propriétés. Une solution couplée légèrement plus lâche consiste à placer la fonctionnalité en tant que méthode sur une classe de base (abstraite), à ​​partir de laquelle s'étend votre classe concrète. Cela partage la fonctionnalité entre toutes les classes enfants. Les solutions mentionnées ci-dessus ont en commun d'avoir un couplage en temps de compilation. Vous ne pouvez pas modifier la dépendance au moment de l'exécution, ce qui rend votre application plutôt rigide. Leur principal avantage est le faible niveau de complexité qu'ils portent.

Si vous voulez une application couplée plus lâche, vous pouvez essayer de remplacer la dépendance dure par une variable, pour donner un niveau d'indirection. Les simples sont de créer un objet et de le partager globalement dans l'application.Il y a un certain nombre de façons de le faire en PHP, comme un singleton ou simplement une variable dans la portée globale (Vous pouvez y accéder avec le mot-clé global, ou via le tableau $GLOBALS). Alors que les variables globales offrent un niveau d'indirection, elles tendent également à introduire beaucoup de complexité, car elles rendent très difficile la détermination des parties de l'application qui dépendent l'une de l'autre. Pour cette raison, ils sont souvent évités par des programmeurs expérimentés. Ceci est particulièrement vrai si la variable a un état; Le problème est moins répandu si l'objet partagé est sans état. La seule façon d'éviter les périls des variables globales est d'utiliser des variables locales à la place. Par exemple. Pour passer les dépendances autour. Cela peut être un peu compliqué, mais d'après mon expérience, ce n'est souvent pas un problème aussi important que ça l'est. Au moins, les avantages l'emportent souvent sur les problèmes. Cela dit, il existe des techniques pour soulager la douleur; Notamment conteneurs d'injection de dépendance, qui sont des usines automatiques qui prennent soin de tout le câblage pour vous. Ils viennent avec leur propre niveau de complexité, mais pour des applications plus importantes, ils peuvent certainement être une bonne solution.

+0

Merci pour la réponse, je comprends l'envers et la baisse pour chaque point. Je vais essayer de simplement passer les helpers dans les variables locales. –

-1

Bien que parfois nécessaire, singletons sont mauvais (parce qu'ils sont l'état global). Essayez de les éviter si vous pouvez l'aider.

EDIT: Si vous ne pouvez pas éviter les singletons, paramétrez au moins la référence à cet état. En d'autres termes, dans une classe, passez le singleton à son constructeur ou aux méthodes qui utilisent le singleton. Le simple fait de faire référence à votre singleton dans votre base de code compromettra votre capacité à tester les classes isolément. Si votre singleton est dynamique, vos tests deviendront soudainement dynamiques, et vos tests pourront commencer à "échouer en cascade" car leurs conditions préalables sont corrompues par l'échec des tests précédents.

+0

Un commentaire expliquant le downvote serait apprécié. –

+0

Je n'ai pas déprimé. Je pense que toutes les réponses sont bonnes à ce sujet, car je ne suis pas sûr d'utiliser le singleton singleton en premier lieu. –

0

Vous ne pouvez pas étendre une classe singleton. Souvenez-vous que dans une classe singleton, nous rendons le constructeur privé, donc si un constructeur est privé, comment pourriez-vous étendre cette classe? Nous savons tous ce que nous créons un objet d'une classe que nous appelons son constructeur et dans le constructeur de classe enfant il a implicitement appelé le constructeur parent. Donc, dans ce scénario, un constructeur privé ne peut pas être appelé dans la classe enfant.

Questions connexes