Prima di dirmi che esiste già una domanda simile, sì, lo so, ho letto it. Ma la domanda ci si concentra su quando, sono interessato a perché.Un buon motivo per utilizzare il modello di progettazione Visitor?
Ho capito come funzionano le cose. Il classico esempio animale, cane, gatto funziona sempre come un incantesimo.
La cosa è questo codice
int main()
{
Cat c;
Sound theSound;
c.letsDo(&theSound);
}
sembra così innaturale per me. Perché?
Voglio dire, sì, in questo modo ho i miei modelli di cane e gatto indifferenziata (prima volta che uso questa parola in inglese btw) perché il vero implentation è nascosto sotto la classe Sound, ma non è che solo un modo per appesantire il tuo codice? Il polimorfismo non è abbastanza per fare qualcosa del genere?
Per me la differenza è che con il polimorfismo è necessario modificare ogni classe (ma il modello rimane lo stesso, giusto?) Mentre si deve solo modificare una classe con il modello di progettazione del visitatore.
Esattamente, il comportamento può essere implementato da una terza parte. –
Ok, ma se si definisce parser per SQL non si ha già la definizione grammaticale? Dove sono i casi d'uso inattesi? In realtà dal momento che stiamo parlando di analisi, non dovrebbe essere un generatore di parser un esempio più appropriato? Lì hai una grammatica arbitraria, quindi devi definire una generica classe tree walker. – dierre
Non si tratta della struttura di SQL. Riguarda il modo in cui il client può utilizzare il risultato/l'output della tua libreria. L'esempio del parser è semplicemente usato perché è un po '"classico". A proposito, se si dispone di un'API completamente generica (nodi "DOM" arbitrari) senza una struttura fissa, si potrebbe essere meglio con l'approccio dell'accessorio generico invece del modello di visitatore. – Dirk