首选方式,以实施访问者模式在动态的语言?
-
09-06-2019 - |
题
作为行使对于自己,我的翻译样本的程序进各种语言。开始在C#我有一个访客的图形接口,像这样:
interface Visitor
{
void Accept(Bedroom x);
void Accept(Bathroom x);
void Accept(Kitchen x);
void Accept(LivingRoom x);
}
移动到红宝石(或蟒蛇,或无论),我不再分派从编译器基础上的类型。我应该做的派遣的访问本身?
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
...
或者我应该做的调度在不同specializaions的房:
class Bathroom<Room
def initialize(name)
super(name)
end
def accept(visitor)
visitor.acceptBathroom(self)
end
end
或是有另一种优选的成语,用于在动态的语言?
解决方案
我的建议是使用前一种方式。有的长处和短处,为每一个方法。前者是难以维持的数量的房间类型的增长;后者是很难如数吸尘器类型的增长。
Ruby,你可以试试
def accept(x)
send "accept#{x.class}".to_sym, x
end
PS:不是所有类型的动态语言是无法做到的调度基础上的类型;一些可以推断出类型,或者如果做不到这一点,可以使用强迫铸选择适当的方法之中载的选择。
其他提示
我会去的第二个版本。第一个看起来像的样的代码的气味,访问是应该解决:长如果其他-如果或关情况下的发言。
不隶属于 StackOverflow