Parsing di input in più sottoclassi

2

Diciamo che ho 10 tipi di messaggi xml che entrano nel mio programma tramite un qualche tipo di input (file, porta, ecc.). Ho 10 sottoclassi di un tipo Message per gestire le esigenze specifiche di ciascun tipo di messaggio.

Quando arriva un nuovo messaggio, c'è un modo migliore di un'istruzione switch che attiva una sottostringa del messaggio, o un enorme albero if / elseif per decidere quale sottoclasse di Message I deve istanziare con la stringa del messaggio in arrivo ?

Vorrei passare la stringa a una factory e restituire la sottoclasse corretta, ma non riesco a trovare un modo che non usi un'istruzione switch.

modifica: Non ho specificato una lingua perché mi sono imbattuto in una situazione simile in più di una lingua, quindi volevo una soluzione generica.

    
posta bh3333 13.01.2015 - 03:12
fonte

2 risposte

0

Il modello di comando probabilmente si adatta meglio alle tue esigenze in questo caso. Avere una classe base MessageHandler con due metodi.

Il primo sarebbe chiamato IsHandlerFor che prende come input xml e restituisce true se è il gestore appropriato per quel tipo specifico di messaggio. Allora avresti un secondo metodo chiamato Handle che prende l'xml ed esegue l'azione appropriata con esso.

Avresti una classe MessageBus che inizialmente istanzia un elenco di questi gestori. Se desideri separare ulteriormente le preoccupazioni, puoi utilizzare una factory, passarla al costruttore di MessageBus , o usare reflection e un file di configurazione.

Quindi quando viene ricevuto un nuovo messaggio, esegui il loop di tutte le tue MessageHandler s chiamando IsHandlerFor . Se restituisce true , puoi chiamare il suo metodo Handle . Se sei sicuro che ci sarà solo un tale gestore, esci dal tuo ciclo. Altrimenti, continua per tutti i gestori e senza sapere come funziona ogni gestore, sei riuscito a gestire un messaggio senza utilizzare uno switch e modularizzando il codice.

Spero che ti aiuti.

    
risposta data 13.01.2015 - 11:45
fonte
0

Esistono tre approcci generali per decidere quale sottoclasse costruire quando hai solo un flusso di dati serializzato.

  1. Codifica le sottoclassi dei messaggi e i relativi tag di identificazione nella classe Factory e seleziona il messaggio corretto usando un interruttore o se / else ladder.
  2. La classe Factory mantiene un registro dinamico delle sottoclassi Message supportate ed esegue una ricerca lineare sul registro per selezionare la sottoclasse Message corretta. Questa soluzione richiede che in qualche modo le sottoclassi Message vengano registrate con Factory e Factory deve essere in grado di creare istanze di classi di cui non è a conoscenza (la Factory conosce solo la classe Message di base). Questo può essere fatto registrando una funzione di fabbrica o un oggetto prototipo per ogni sottoclasse di messaggi.
  3. Si utilizza la reflection per abbinare il tag XML a una sottoclasse Message. Tutto questo, ma richiede che i nomi delle classi corrispondano ai nomi dei tag XML.
risposta data 13.01.2015 - 09:49
fonte

Leggi altre domande sui tag