Domanda

Come risolveresti questo problema? (All'inizio sembrava semplice, poi l'ho trovato perplesso).

  • Hai una classe chiamata Executor. Supponiamo che tu ne abbia molti esempi e che facciano cose diverse su chiamata di un metodo do (Argomento).
  • L'argomento ha 2 parametri diversi e sono A * pa, B * pb (uno dei quali può essere nullo)
  • Ora, voglio un manager di classe che riceve istanze Argument e le inoltra all'istanza appropriata di Executor (chiamiamo questo metodo Filter). Questo viene fatto dopo, qualche tempo prima, ogni Executor chiamato il metodo Manager.subscribe (A * pa, B * pb) per dire a quale di questi è interessato. Nota che: se pa o (non entrambi) pb sono NULL, significa QUALSIASI (intendo se pa è NULL, viene controllato solo pb). Ovviamente non ci deve essere più di un Executor.
  • L'implementazione deve essere VELOCE, l'ideale dovrebbe essere un vettore o qualcosa di simile a una mappa di hash ... MA IL CONFRONTO DEVE ESSERE EFFETTUATO SUL CONTENUTO di pa e pb, non il loro valore come puntatori.
  • Infine, deve essere possibile che l'abbonamento possa essere annullato da un esecutore (senza attendere troppo a lungo). Ad ogni modo, voglio che Filter, iscriviti e cancelSubscription siano molto veloci.

Ho pensato a molti arrangiamenti, con mappe hash, elenchi e mappe multiple ... Ma a tutti loro manca la velocità, la semplicità o qualcos'altro. Cosa faresti?

È stato utile?

Soluzione

Penso che tu voglia creare una classe chiamata " Sottoscrizione " che rappresenta una singola sottoscrizione da un Executor a un Manager contenente informazioni sulle condizioni che la sottoscrizione attiva, nonché una sorta di GUID o nome per questa sottoscrizione. Sto pensando a qualcosa come

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

La sottoscrizione avrebbe anche un metodo per " Verifica " se deve attivarsi in base a determinati valori per A e B e quindi chiamare l'esecutore su tali parametri se corrisponde.

La classe Manager conterrebbe quindi tre mappe, una di queste Linee guida per l'abbonamento * e consentirebbe disiscrizioni molto rapide, fondamentalmente cercare il GUID nella richiesta di disiscrizione per ottenere l'oggetto Abbonamento, usare quell'oggetto per determinare quali valori per Potrebbe essere necessario eliminare A e B dalla mappa A e dalla mappa B, quindi eliminare l'oggetto. Abbonarsi è solo una questione di creazione dell'oggetto Abbonamento e aggiunta di valori alla Mappa guida, A Mappa e Mappa B.

Eseguendo una ricerca in base a (A, B), se A o B è nullo, si esegue la ricerca nell'altra tabella hash e si attiva la sottoscrizione restituita. Se Né A né B sono nulli, le cose diventano più complicate.

Qui, la cosa da fare sarebbe trovare un incrocio sugli insiemi restituiti guardando A e guardando B. Questo può essere fatto manualmente, ma un metodo più veloce potrebbe essere quello di avere una mappa aggiuntiva che è la chiave B aggiunta ad A.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top