Pregunta

¿Cómo resolverías este problema? (Al principio parecía simple, luego lo encontré desconcertante).

  • Tienes una clase llamada Executor. Supongamos que tiene muchos ejemplos de ello y que hacen cosas diferentes al llamar al método do (Argumento).
  • El argumento tiene 2 parámetros diferentes y son A * pa, B * pb (uno de los cuales puede ser nulo)
  • Ahora, quiero un administrador de clase que reciba las discrepancias de Argument y las envíe a la instancia apropiada del Ejecutor (llamemos a este método Filter). Esto se hace después de, un tiempo antes, cada Ejecutor llamó al método Manager.subscribe (A * pa, B * pb) para decirle cuál de estos está interesado. Tenga en cuenta que: si pa o (no ambos) pb son NULL, significa ANY (quiero decir que si pa es NULL, solo pb está marcado). Por supuesto, no debe haber más de un Ejecutor.
  • La implementación debe ser RÁPIDA, el ideal debe ser un vector, o algo parecido, como un mapa hash ... PERO LA COMPARACIÓN DEBE REALIZARSE EN EL CONTENIDO DE pa y pb, no su valor como punteros.
  • Finalmente, debe ser posible que la suscripción pueda ser cancelada por un ejecutor (sin esperar demasiado). De todos modos quiero que el filtro, la suscripción y la cancelación de la suscripción sean muy rápidas.

He estado pensando en muchos arreglos, con mapas hash, listas y multimapas ... Pero a todos les falta velocidad o facilidad, o algo más. ¿Qué harías?

¿Fue útil?

Solución

Creo que quieres crear una clase llamada " Suscripción " que representa una suscripción única de un Ejecutor a un Administrador que contiene información sobre las condiciones en las que se activaría esta Suscripción, así como algún tipo de GUID o nombre para esta suscripción. Estoy pensando en algo como

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

La suscripción también tendría un método para " Comprobar " si debería activarse en función de los valores dados para A y B y luego llamar al ejecutor de esos parámetros si coincide.

La clase de administrador contendría tres mapas, uno de estos mapas Guid to Subscription * y permitiría la cancelación rápida de la suscripción, básicamente busque el GUID en la solicitud de cancelación de suscripción para obtener el objeto de suscripción, use ese objeto para determinar para qué valores Es posible que A y B deban eliminarse del mapa A y del mapa B, luego elimine el objeto. Suscribirse es solo una cuestión de crear el objeto Suscripción y agregar valores al Mapa Guid, al Mapa A y al Mapa B.

Haciendo una búsqueda basada en (A, B), si A o B es nulo, usted realiza la búsqueda en la otra tabla hash y activa la suscripción que se devuelve. Si Ni A ni B son nulos, las cosas se ponen más difíciles.

Aquí, lo que hay que hacer sería encontrar una intersección en los conjuntos devueltos al buscar A y buscar B. Esto se puede hacer manualmente, pero un método más rápido podría ser tener un mapa adicional, la clave es B anexado a A.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top