例如,我们在根目录下有一个Application对象.应用程序中的每个属性表都是一个View对象.页面下的每个页面都被称为页面对象本身.
从Perl,我们发送命令到GUI应用程序,GUI解释命令并很好地响应命令.要发送命令,我们执行以下操作:
socket_object->send_command("App.View2.Page2.Activate()") socket_object->send_command("App.View1.Page3.OKBtn.Click()")
这不是很可读.相反,我想为App,View和Page写一个Perl DSL.
Perl提供某种DSL结构,我可以在以下几个方面做
App.View2.Page2.Activate(); App.View1.Page2.Click();
应用程序应该是应用程序类的一个实例.我必须在运行时获取View2的对象.
如何使用这样的东西?
解决方法
>为了正确处理你在那里的事情,你必须有很多先进的技巧,根据定义,这不是可维护的.你必须:
> overload连接运算符”. (需要有福的参考)
关闭strictures或创建一个AUTOLOAD子站点,以允许那些裸露的单词 – 当然,您可以为所有想要使用的单词(或使用barewords模块)编写子站点.
>可能,创建多个包,多个AUTOLOAD
>另一种方式是source filters,我可以拿起一个downvote,只是为了提到这个能力.所以我不会为那些要求帮助的人推荐这种方法.但它在那里.来源过滤器(和我已经完成了我的分享)只是其中一个可以认为你太聪明的领域.
不过,如果您对Perl作为DSL“主机”语言感兴趣,那么source filters不是完全不受限制的.然而,将这个限制在你想要做的事情上,Perl6::Attributes可能会大部分时间完成你所需要的工作.这将需要并将它们翻译成“ – >” Perl会明白.但是您仍然可以查看源过滤器来了解幕后发生的情况.
我也不想离开这个话题,而不是建议您使用Damian Conway的Filter::Simple来缓解您生成自己的源代码过滤器(我建议不要做)的很多挫败感.
最简单的就是放弃”.运算符,而只是期望Perl的代码.
App->View2->Page2->Activate(); App->View1->Page2->Click();
应用程序将是一个包或一个子.在当前包中定义的或导入的,它将一个带有View2子(可能是一个AUTOLOAD
子)的一个对象保存到一个包中,该对象返回一个包或名称被引用到包中的名称,它可以理解Page2,然后最终从那里返回会了解Activate或Click. (见OO tutorial,如果需要的话)