2009-08-04 7 views
3

Pour les applications de toute taille, quels sont les inconvénients de l'utilisation d'un pattern Context.Current? (par exemple, "Current" est une propriété partagée/statique d'une classe "Context" qui s'instancie automatiquement la première fois qu'elle est utilisée)Inconvénients de Context.Current Pattern?

Un avantage d'utiliser ce modèle plutôt que des classes/méthodes statiques/partagées?

Je demande dans le contexte de .NET, bien que je suppose qu'il pourrait s'appliquer dans une variété de langues.

Répondre

5

Il s'agit d'un type de motif singleton, représentant généralement le stockage local. Un exemple bien connu dans le monde .NET est le HttpContext.

Le problème le plus courant est testabilité. Certainement pas impossible, mais le modèle encourage un modèle d'utilisation qui n'est pas compatible avec TDD, donc l'utiliser exige une vigilance accrue. Dans ASP.NET MVC, nous voyons un modèle beaucoup amélioré par lequel l'objet de contexte lui-même est passé à travers chaque couche en tant que paramètre d'entrée, plutôt que de s'appuyer sur le stockage singleton pour accéder à cet objet.

Une autre façon de voir cela est qu'il ne joue pas bien avec d'autres modèles OO, sans doute beaucoup plus utiles, tels que injection de dépendance. La plupart diraient que vous obtenez beaucoup plus de kilomètres d'être en mesure d'utiliser DI que d'avoir un raccourci singleton pratique à votre état actuel.

Comme avec n'importe quel état singleton ou global, il introduit également un ensemble de problèmes avec multi-threading et la concurrence. Il existe des modèles bien établis pour les atténuer, mais évidemment, chaque fois que vous utilisez un modèle qui nécessite une «atténuation», vous vous exposez à beaucoup de risques qui ne seraient pas autrement un problème.

Il y a parfois des endroits appropriés pour les singletons, mais ils sont très rares et éloignés. La décision de stocker l'état dans un singleton devrait être très soigneusement faite par une équipe expérimentée. Une équipe inexpérimentée devrait les éviter pour être du bon côté.

Questions connexes