Pouvez-vous expliquer le modèle de conception du contexte?

J’ai commencé à lire sur le modèle de conception du contexte . Voici ce que j’ai compris du texte:

Est-ce que je l’ai eu?

Est-ce que je l’ai eu?

Désolé de le dire, pas tout à fait.

L’object de Context Object n’est pas de transmettre implicitement beaucoup de parameters aux méthodes, comme moyen de contourner le typage fort et l’encapsulation. L’objective est de stocker les données sous une forme générale, mais gérée, indépendamment des protocoles et de la technologie de présentation. Les données stockées dans une scope sont par nature partagées, peuvent toujours être structurées et sont insortingnsèquement différentes des parameters uniques transmis à une méthode.

Context Object Pattern a été introduit pour la première fois dans les Patterns J2EE Core 2nd Ed . La partie ‘Context’ fait référence au fait que l’object contient des données dans le contexte d’une étendue
(comme application/session/request/conversation/flash ).

Son but est de découpler, autant que possible, les données et la logique des applications à partir de classes spécifiques au protocole / à la technologie de présentation, telles que HttpSession et HttpRequest .

La mise en œuvre du modèle

Sous Context Object, les données destinées à l’application / session / requête / autre domaine ne sont pas directement ServletContext dans ServletContext / HttpSession / HttpRequest / autre classe spécifique au protocole. Au lieu de cela, les données sont stockées dans une classe wrapper POJO, qui se trouve alors dans ServletRequest / HttpSession / HttpRequest / other.

L’object de contexte peut stocker les données dans une carte, mais il n’est pas nécessaire de les stocker – il peut stocker les données dans n’importe quelle structure / format pertinent pour le programme.

Une application peut utiliser une classe d’object de contexte par domaine d’application, ou plusieurs classes qui divisent les données de manière ordonnée, en évitant les surcharges de classe excessives et en favorisant la séparation des problèmes.

L’object de contexte est utilisé par les classes de présentation au premier plan (vues, contrôleurs frontaux, répartiteurs). Ces objects client de présentation appellent contextObject.get pour récupérer les données scoped stockées et contextObject.put pour stocker les données contextuelles.

Il ne passe pas dans la logique métier / intégration. Il n’est pas utilisé pour transmettre une multitude de parameters à des objects métier, en contournant le typage fort. Les niveaux métier et d’intégration sont gérés par des delegates commerciaux, des services d’application et / ou des façades de session qui utilisent des parameters spécifiques fortement typés.

Avantages du patron

  • Testabilité: les tests unitaires ne doivent simuler qu’un simple POJO, plutôt qu’une classe de serveur complexe spécifique à un protocole, telle que ServletContext ou HttpRequest
  • Flexibilité et réutilisabilité: le cœur de l’application fonctionne indépendamment de la couche de présentation spécifique aux protocoles. Cela signifie qu’une application peut plus facilement changer ou append des protocoles ou une technologie de présentation (par exemple, HTML / HTTP / Servlet et WAP / Servlet et XML / SOAP / HTTP / EJB et HTML / HTTP / JSF).

commentaires

  • Est un modèle historique
  • On pourrait faire valoir que les infrastructures d’dependency injections, telles que CDI, Guice, Spring, Seam et autres, permettent déjà de stocker des données de manière indépendante du protocole. c’est-à-dire que toutes les scopes sont déjà implémentées en tant qu’objects contextuels, ce qui signifie que le développeur est moins obligé de créer des objects de contexte supplémentaires. Cela ne nie pas le modèle – cela signifie que le framework CDI prend déjà en charge le modèle.
  • Si implémenté de manière incorrecte, on peut se retrouver avec l’antipat “Passer autour des objects de contexte Ginormous dans l’application”

Citant KaptajnKold: Je pense que vous l’avez compris. Cependant, je pense aussi que c’est plus un anti-modèle à éviter. Voyez pourquoi ici .

Vos commentaires font référence à la version non mise en œuvre de l’object contextuel. L’object de contexte lui-même n’est pas un anti-pattern.

Un object de contexte permet d’accéder aux données et fonctions partagées.

Il peut être un substitut élégant et flexible pour:

  • globales
  • singletons
  • longues listes de parameters

L’ACCU fournit une description plus détaillée.

Si vous voulez un exemple concret du modèle de contexte en Java, consultez les API de Google Android .

Vous devez tenir compte de votre graphique de dépendance lors de l’utilisation du modèle de contexte. (C’est la raison pour laquelle KaptajnKold l’appelle un anti-pattern.)

Pour limiter les dépendances inutiles, utilisez différents contextes à des fins différentes. Gardez vos contextes aussi simples que possible et utilisez la composition ou l’inheritance pour append de la complexité en cas de besoin.

Une classe utilisant le contexte pour l’inialiser. Considérez ce code

 public class BuildTagHandler extends TagHandler { public BuildTagHandler(ServiceContext context) { // constructor this.tagDAO = context.getTagDAO(); this.buildDAO = context.getBuildDAO(); } 

Vous utiliserez le contexte pour construire votre classe. Dans le fichier de contexte , vous n’aurez pas d’implémentations, au lieu de cela, vous avez beaucoup d’objects DAO

Vous pouvez l’interpréter comme un motif de façade ou une interface énorme pour toutes les entrées.

Le contexte est un anti-motif, car il est utilisé comme contenant pour ce qui est inconnu a priori.