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?

È stato utile?

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.

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