Question

Comment résoudriez-vous ce problème? (Au début, cela semblait simple, puis j’ai trouvé cela déroutant.)

  • Vous avez une classe appelée Executor. Supposons que vous en ayez plusieurs exemples et qu’ils fassent différentes choses lors de l’appel d’une méthode do (Argument).
  • L'argument a 2 paramètres différents et sont A * pa, B * pb (dont l'un peut être null)
  • Désormais, je souhaite un gestionnaire de classe qui reçoive des arguments d'argument et les transmette à l'instance appropriée de l'exécuteur (appelons cette méthode Filter). Ceci est fait après, quelque temps avant, chaque exécuteur a appelé la méthode Manager.subscribe (A * pa, B * pb) à dire à laquelle l'un de ceux-ci est intéressé. Notez que: si pa ou (pas les deux) pb sont NULL, signifie ANY (je veux dire si pa est NULL, seul pb est coché). Bien sûr, il ne doit pas y avoir plus d'un exécutant.
  • La mise en oeuvre doit être RAPIDE, l’idéal doit être un vecteur ou une carte proche de celle d’une carte de hachage ... MAIS LA COMPARAISON DOIT ÊTRE FAITE SUR LE CONTENU de pa et pb, et non leur valeur en tant que pointeurs.
  • Enfin, il doit être possible que l'abonnement puisse être annulé par un exécuteur (sans attendre trop longtemps). Quoi qu'il en soit, je souhaite que les filtres, les abonnements et les annulations d'abonnement soient très rapides.

J'ai pensé à de nombreux arrangements, avec des cartes de hachage, des listes et des cartes multiples ... Mais ils manquent tous de rapidité, de facilité, ou autre chose. Que feriez-vous?

Était-ce utile?

La solution

Je pense que vous souhaitez créer une classe appelée "Abonnement". qui représente un seul abonnement d'un exécuteur à un gestionnaire contenant des informations sur les conditions dans lesquelles cet abonnement déclencherait, ainsi qu'une sorte de GUID ou un nom pour cet abonnement. Je pense à quelque chose comme

 class Subscription
 {
   GUID g;
   A_filter a;
   B_filter b;
   Executor *e;
 }

La souscription aurait également une méthode pour "vérifier". s'il doit se déclencher sur la base des valeurs données pour A et B et ensuite appeler l'exécuteur sur ces paramètres s'il correspond,

La classe Manager contiendrait alors trois cartes, l’une de ces cartes Guid to Subscription *, autoriserait les désinscriptions très rapidement. En gros, recherchez le GUID dans la demande de désabonnement pour obtenir l’objet Subscription. Utilisez cet objet pour déterminer les valeurs à utiliser. Il peut être nécessaire de supprimer A et B des cartes A et B, puis de supprimer l'objet. L'inscription consiste simplement à créer l'objet Abonnement et à ajouter des valeurs aux cartes Guid, A et B.

En effectuant une recherche sur la base de (A, B), si A ou B est null, vous effectuez la recherche dans l'autre table de hachage et vous déclenchez l'abonnement renvoyé. Si ni A ni B ne sont nuls, les choses deviennent plus compliquées.

Ici, la chose à faire serait de trouver une intersection sur les ensembles retournés en recherchant A et B. Ceci peut être fait manuellement, mais une méthode plus rapide pourrait simplement consister à avoir une carte supplémentaire dont la clé est B ajouté à A.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top