В качестве упражнения для себя я переводил пример программы на разные языки. Начиная с C #, у меня был интерфейс шаблон посетителя так:
interface Visitor
{
void Accept(Bedroom x);
void Accept(Bathroom x);
void Accept(Kitchen x);
void Accept(LivingRoom x);
}
Переходя на ruby (или python, или что-то еще), я больше не получаю диспетчерскую рассылку на основе типа. Должен ли я сделать отправку в самом посетителе?
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
...
Или я должен сделать отправку по различным специализациям комнаты:
class Bathroom<Room
def initialize(name)
super(name)
end
def accept(visitor)
visitor.acceptBathroom(self)
end
end
Или есть другая предпочтительная идиома, которая используется в динамических языках?