当前位置: 首页 > 编程日记 > 正文

Ruby DSL介绍及其在测试数据构造中的使用(1)

什么是DSL?英文全称Domain Specific Language,中文解释为领域专用语言。顾名思义,DSL是针对某个特定领域而开发的语言。像我们平时接触到的C/C++,Java,Python/Ruby,都属于通用语言,可以为各个领域编程,通用性有余,则针对性不够强。DSL恰恰是为了弥补通用语言的这个劣势而出现的。

DSL其实并没有那么神秘。实际上,在平时的面向对象的编程中,大家会自觉不自觉的使用DSL的一些方法和技巧。比如,如果我们定义了非常面向业务的函数,然后这些函数的集合就可以被称为一种DSL了。Smalltalk的开发者Blaine Buxton 这样评价DSL:" I believe a DSL is a healthy bi-product of a good object-oriented design"。

然而,也正是因为DSL的构建可以像定义函数一样简单,这也让很多人觉得DSL不过就是定义一些合适的函数——如果那些函数在调用时不用带上括号的话那就更好了。诚然,DSL和定义合适的函数之间是有一些类似之处,但是这恰恰是同一个问题的两面,DSL更多是从客户的角度出发看待代码,定义函数则更多的从解决问题的方案的角度看待代码。诚然两者都有交集,但是出发点却截然不同。

我引用Obie Fernandez在QCon上举的一个例子来看看定义函数和定义DSL的差别。

场景:如果你想要一杯咖啡。。。

你可以定义好一个叫做Latte的类,然后:


如果你不是这个类的设计者,你会问,第一个参数是什么意思?第二个呢?第三个?还有,那个false谁能给点提示?

或者你也可以这样:



  我只要告诉你,order等号后面,按照你想要的类型去点就可以了。

从上面的例子上,我们大体可以看出定义函数和DSL之间的风格的差别了。相比较而言,DSL的风格更面向客户,语法也更加友好。有人会问:“我为什么要用DSL?DSL都是给不懂编程的人用的。” 非也。DSL说到底是为了更加快速的描述问题,解决问题的。像Capistrano(一种网络应用的部署解决方案)用DSL来定义部署操作:


      即便我们没有学过Capistrano的语法,从上面的文件中我们也可以大体了解这些操作做了什么。上面的文件并不是什么简化的说明文档,而是实实在在可以运行的代码。

又比如Rake(Ruby版的Makefile):

对于熟悉Ruby的人来说,这个DSL基本就是Ruby的语法了,但是可以通过一些关键字完成更为强大的功能。

按照Marting Fowler的看法,DSL可以分为两种基本类型:内部DSL和外部DSL。顾名思义,外部DSL就相当于实现一种编程语言,也许不如实现一门通用语言那么复杂,但是工作量不小;内部DSL就是基于一种通用编程语言的基础上进行关键字的定义封装来达到DSL的目的,这种DSL的扩展性可能会受到母语言的影响,对于不熟悉母语言的人来说可能不是那么好理解,不过好处就是你可以利用母语言本身通用的其他功能。那么Ruby DSL自然是一种内部DSL了。

(文章转载请注明出处)

相关文章:

2017年度最受欢迎开源中国项目:roncoo-pay投票评选

2019独角兽企业重金招聘Python工程师标准>>> roncoo-pay项目正在参加 2017年度最受欢迎中国开源软件评选,请大家投上宝贵的一票,支持roncoo-pay更好的发展,为大家带来更多好用的支付功能! 2017年度最受欢迎中国开源软件…

编程小问题系列(2)——为什么WPF里MediaElement等视频控件不起作用

为什么WPF里MediaElement等视频控件不起作用?非常可能的原因是因为没有安装Microsoft Windows Media Player 10或者10以上的播放器,MSDN文档里就写有下面一句话:Both and are used to present audio, video, and video with audio content. B…

国行版HomePod售价2799元,本周五发售

(图片源自苹果中国官网截图)整理 | 一一出品 | AI科技大本营去年 12 月,苹果表示将于今年年初在中国销售其 HomePod 智能音箱。1 月 14 日,苹果公司正式宣布,HomePod 将于 1 月 18 日(本周五)在…

维基百科联手谷歌翻译,结果“惨不忍睹”!

作者 | 琥珀出品 | AI科技大本营作为前沿科技新闻报道的一线工作者,我们经常会碰到各种陌生难懂、语言不通的词句。这直接导致我们在引用和查找信息时,往往辅助以维基百科和谷歌翻译为代表的两大信息引擎,其重要性不言而喻。然而,…

Ruby DSL介绍及其在测试数据构造中的使用(2)

在(1)中介绍了DSL和普通的函数定义之间的区别。在(1)的最后提到,DSL分为内部DSL和外部DSL,我们再看一遍他们的定义:1. External DSLs 用不同于host语言的语言来编写,通过编译和解释器来翻译成host语言 2. Internal DSLs 将host语言…

批量编译fla文件

jsfl太神奇了不过内存不高的机器还是少编译一点,会同时打开你选择的文件夹下的所有fla文件,然后一个一个自动编译。Compile flas.jsfl//----------------------------------Start--------------------------------//Brent Arnolds kick butt batch folde…

字符串转换成utf-8编码

a、将字符串转换成utf-8编码的字节,并输出,然后将该字节在转换成utf-8编码字符串,在输出 b、将字符串转换后才能gbk编码的字节,并输出,然后将该字节在转换成gbk编码字符串,在输出 123456789101112def main(…

50万奖金+京东数科offer,JDD-2018全球总决赛冠军诞生

(JDD 大赛总决赛选手与导师、评委合影)整理 | 一一出品 | AI科技大本营1 月 13 日,JDD-2018 京东数字科技全球探索者大赛全球总决赛落下帷幕。在经过 24 小时极限挑战和 2 小时商业路演的较量后,来自以色列赛区的团队“Cheese&…

三星笔记本FN功能键操作大全

Samsung 的快捷键都很简单,提供的都是最常用的功能,但新出的X系列和P系列机的FN快捷键差异很大,例如X10和P25。现在介绍FN快捷键以巧的X10为主,补充说明P25。FN上方向键/下方向键:增加/减低亮度FN左方向键/右方向键:增…

[翻译] Ruby Golf

原文地址:http://rubysource.com/ruby-golf/ Ruby golf is the art of writing code that uses as few characters as possible. The idea originates in the world of Perl (where it is, unsurprisingly, known as Perl Golf). As a language, Perl is well suite…

AI删库,程序员背锅?

作者 | 一一出品 | AI科技大本营又一代码清库的惨案发生了,不过这次要背锅是 AI。近日,美国最大点评网站 Yelp 的工程师训练的神经网络闯祸了。他们训练了一个用来消除 bug 的神经网络,万万没想到,该网络删除一切,从根…

OpenStack Keystone架构一:Keystone基础

一 什么是keystone keystone是OpenStack的身份服务,暂且可以理解为一个与权限有关的组件。 二 为何要有keystone Keystone项目的主要目的是为访问openstack的各个组件(nova,cinder,glance...)提供一个统一的验证方式,具体的&#…

用gdb调试mpi程序的一些心得

Linux下MPI (Message Passage Interface) 的程序不太好调试,在windows下vs2005以上的IDE有集成的简便MPI调试工具,没有用过,有兴趣的可以试验一下。下面总结了一些最近在用MPI和c语言写程序时的调试经验(Ubuntu环境,c语…

开源如何占领软件世界?

作者 | Mike Volpimavolpi译者 | 风车云马编辑 | 一一出品 | AI科技大本营5 年前,投资商对开源这种商业模式的可行性持有怀疑态度。他们普遍认为,红帽(redhat)公司犹如雪花飘零——在软件世界里开源公司不可能占据举足轻重的地位。…

软件工程概论——课堂测试1

设计思想&#xff1a;1.用1个页面&#xff0c;实现课程录入&#xff0c;提交后直接返回课程界面。2.应用html表单属性进行数据的提交。3.用servlet进行写入数据库和验证输入。 源代码&#xff1a; <% page language"java" import"java.util.*" contentT…

过程即奖励(The Journey is the Reward)

今天读完了《乔布斯传》。翻着这本书最后的影集&#xff0c;乔布斯传奇一生的一幕幕仿佛在眼前展开。从第一张照片中特里独行、桀骜不驯的年轻人&#xff0c;到最后一张照片中阳光下慈祥微笑的老者&#xff0c;看到的仿佛不是乔布斯的照片&#xff0c;而是自己的一位人生挚友。…

BREW 计费模式概览

计费模式也就是收入模型是商业模式的基础。BDS分发系统中不但提供了与运营商计费系统的接口&#xff0c;而且直接提供了BREW 计费服务。 BREW分发系统与运营商计费系统的集成&#xff0c;一般就是与运营商的综合营帐系统的集成&#xff0c;需要融合于网元层&#xff0c;资源层&…

程序员崩溃了,年终奖怎么说黄就黄

作者 | 胡巍巍转载自程序人生&#xff08;ID:coder_life&#xff09;往年王者荣耀年终奖200个月100万&#xff08;虽然辟谣是假的&#xff09;、华为年终奖24个月100万&#xff0c;都让我等平民羡煞不已。还有在BAT发生的&#xff08;朋友圈&#xff09;真人真事↓这是年终奖的…

改变IT世界的11大Apache开源技术

据国外媒体报道&#xff0c;转眼之间&#xff0c;Apache软件基金会已经成立10年之久了&#xff0c;11月份&#xff0c;Apache基金会的成员将会为其举行一次大型的庆祝。虽然Apache软件基金会是一个开源的组织&#xff0c;但是Apache却创造了对现代互联网来说很重要的技术。下面…

nginx常用技术

作者:NetSeek http://www.linuxtone.org (IT运维专家网|集群架构|性能调优)欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.首发时间: 2008-11-25 更新时间:2009-1-14目 录一、 Nginx 基础知识二、 Nginx 安装及调试三、 Ngi…

2011到过的地方

火车上读《南方周末》&#xff0c;看到记者把自己2011去过的地方在地图上标记&#xff0c;带着标记的世界地图&#xff0c;显得特别而好看&#xff0c;于是很想自己也做一份。找了一些网站&#xff0c;做的图片&#xff0c;差强人意吧。2011到过的地方&#xff1a;这个图不算漂…

2亿简历遭泄漏,到底谁的锅?

作者 | 仲培艺转载自CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;前面刚有 AWS 开战 MongoDB&#xff0c;双方“隔空互呛”&#xff0c;这厢又曝出 2 亿简历信息泄露——MongoDB 的这场开年似乎“充实”得过分了些。长期以来&#xff0c;作为“最受欢迎的 NoSQL 数据库…

Could not apply the stored configuration for monitors 解决办法

Could not apply the stored configuration for monitors 解决办法&#xff1a; $ sudo rm -rf ~/.config/monitors.xml 重启电脑即可 本文转自linux博客51CTO博客&#xff0c;原文链接http://blog.51cto.com/yangzhiming/1225802如需转载请自行联系原作者 yangzhimingg

20行Python代码给微信头像戴帽子

作者 | Leauky&#xff0c;北理工硕士在读&#xff0c;非CS专业的Python爱好者。朋友圈里微信官方要求戴圣诞帽的活动曾经火爆一时&#xff0c;有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶&#xff0c;然后可高兴地表示“哎呀好神奇hhhh”&#xff0c;呆…

2012关于钱的Tips

对于目前的我来说&#xff0c;死工资是唯一的财富积累手段&#xff0c;而且工资本身还不足够满足所有的物质和精神需求。以此为前提&#xff0c;对钱的来龙去脉有一个了解、把控是极其有必要的。 2011钱的规划基本为零&#xff0c;一年下来惊恐的发现&#xff0c;似乎自己没攒多…

在 Azure 中管理 Windows 虚拟机的可用性

了解如何设置和管理多个虚拟机&#xff0c;以确保 Azure 中 Windows 应用程序的高可用性。 也可以管理 Linux 虚拟机的可用性。 Note Azure 具有用于创建和处理资源的两个不同的部署模型&#xff1a;Resource Manager 和经典。 这篇文章介绍了如何使用这两种模型&#xff0c;但…

[日记]一个人去散步

森林里面的寂静会让每一个人都有所进步。 ——罗伯特M波西格 《禅与摩托车维修艺术》 北陵公园下午5点之后免收门票&#xff0c;我就在这个时间去那里散步。 说起来&#xff0c;我家离北陵西门走路才10几分钟的路程&#xff0c;可是我…

2019年人工智能行业又进入冬天了吗?

【AI科技大本营导语】过去几年&#xff0c;以深度学习为代表的人工智能技术取得了前所未有的高速发展&#xff0c;公司高薪聘请相关领域研究人员&#xff0c;组建人工智能研究团队&#xff0c;相信人工智能带来的巨大商业价值。然而&#xff0c;从近一年的发展态势来讲&#xf…

Vue.js slots: 为什么你需要它们?

也许你已经看过了Vue.js slots的文档。我对这个功能从“为什么你可能需要它”到“没有它我怎么可能工作”的态度转变非常快。虽然文档已经解释了它的概念&#xff0c;但是这里有一个关于slots怎么改进应用程序代码库的真实例子。在我看来&#xff0c;slots是vue最有用和最有趣的…

apache httpd server安装的一个问题

问题&#xff11;&#xff1a; 启动bin/apachectl start的时候&#xff1a; 发现报错&#xff1a;httpd: bad user name daemon 解决方法&#xff1a; groupadd daemon useradd -g daemon daemon 若没有配置合适PATH常量&#xff0c;则可以找 /usr/sbin/groupadd&#xff0c…