modo preferito per implementare il modello di visitatore in linguaggi dinamici?
-
09-06-2019 - |
Domanda
Come esercizio per me, stavo traducendo un programma di esempio in varie lingue.A partire da C#, avevo un'interfaccia modello visitatore in questo modo:
interface Visitor
{
void Accept(Bedroom x);
void Accept(Bathroom x);
void Accept(Kitchen x);
void Accept(LivingRoom x);
}
Passando a Ruby (o Python o qualsiasi altra cosa), non ricevo più l'invio dal compilatore in base al tipo.Dovrei effettuare l'invio nel visitatore stesso?
class Cleaner
def accept(x)
acceptBedroom(x) if Bedroom === x
acceptBathroom(x) if Bathroom === x
acceptKitchen(x) if Kitchen===x
acceptLivingRoom(x) if LivingRoom===x
end
...
Oppure dovrei fare l'invio nelle diverse specializzazioni della stanza:
class Bathroom<Room
def initialize(name)
super(name)
end
def accept(visitor)
visitor.acceptBathroom(self)
end
end
Oppure esiste un altro idioma preferito utilizzato nei linguaggi dinamici?
Soluzione
Il mio consiglio è di utilizzare il primo approccio.Ci sono vantaggi e svantaggi per ogni approccio.Il primo è più difficile da mantenere man mano che cresce il numero di tipologie di stanze;quest'ultimo è più difficile man mano che cresce il numero di tipi di Pulitori.
In Ruby potresti provare
def accept(x)
send "accept#{x.class}".to_sym, x
end
PS:non tutti i linguaggi tipizzati dinamicamente non sono in grado di eseguire l'invio in base al tipo;alcuni possono dedurre il tipo o, in mancanza di ciò, possono utilizzare il casting forzato per scegliere il metodo corretto tra le opzioni sovraccaricate.
Altri suggerimenti
Io opterei per la seconda versione.Il primo sembra il tipo di odore di codice che Visitor dovrebbe risolvere:istruzioni lunghe if-else-if o switch-case.